#c #arrays #sorting #search #binary-search-tree
#c #массивы #сортировка #Поиск #binary-search-tree
Вопрос:
Вопрос в том, чтобы найти «K-й» наименьший элемент в массиве. https://practice.geeksforgeeks.org/problems/kth-smallest-element/0
Теперь я видел приведенные методы, но не могу понять их должным образом. Моя первая ИНТУИЦИЯ после того, как было создать по британскому летнему времени от данного массива и использование симметричного обхода по британскому летнему времени, чтобы найти «КТН» наименьшего элемента массива. Вот код моего подхода.
/*
#include <bits/stdc .h>
using namespace std;
struct node{
int data;
node* left;
node* right;
};
vector<int> v;//sorted vector
node* insert(node* root,int data){
if(!root){
root = new node();
root->data = data;
root->left = NULL;
root->right = NULL;
return root;
}
if(root->data > data)
root->left = insert(root->left , data);
else
root->right = insert(root->right , data);
return root;
}
void inOrder(node* root){
if(!root)
return;
inOrder(root->left);
v.push_back(root->data);
//cout<<root->data<<" ";
inOrder(root->right);
}
int main() {
int t;
cin>>t;
while(t--){
node* root = NULL;
int n,el;
cin>>n;
for(int i=0;i<n;i ){
cin>>el;
root = insert(root,el);
}
int k;
cin>>k;
inOrder(root);
cout<<v[k-1]<<endl;
v.clear();
}
return 0;
}
*/
Теперь, по моему мнению, это должно быть O (n) в худшем случае, но я не уверен. Этот код дает мне «TLE». Помогите мне исправить этот код. Это, наверное, первый раз у меня есть интуиция, чтобы решить вопрос с помощью по британскому летнему времени, поэтому я хотел бы завершить этот вопрос только через такой подход.
Комментарии:
1. Ваш код не O (n), а O (n * 2) в худшем случае и O (n * log n) в среднем. Я ожидаю, что TLE происходит с данными, намеренно выбранными для выявления поведения в наихудшем случае. В худшем случае случится с (например) уже отсортированные данные, когда свои по британскому летнему времени будет вырождается в связанный список. Это хорошо известная проблема с по британскому летнему времени. Хорошей новостью является то, что код кажется правильным, если он неэффективен.
2. И почему это O (n ^ 2)? Это потому, что каждая вставка равна O (n), и вызов ее ‘n’ раз делает ее O (n ^ 2)? Значит, этот подход нельзя использовать?
3. Вот и все, с отсортированными данными это то, что произойдет.
4. Опечатка в комментарии выше. Конечно, я имел в виду O (n ^ 2), то есть квадратичное время, а не O (n * 2).
5.
nth_element
равно O (n), вы могли бы просто использовать это.
Ответ №1:
Вы просто не можете решить этот вопрос С по британскому летнему времени.
Вопрос Клири утверждает, что ожидаемая временная сложность: O (N).
Но сама операция вставки занимает среднее значение O (logN), худшее O (N).ССЫЛКА
Вы выполняете операцию вставки N раз. Следовательно,
for(int i=0;i<n;i ){
cin>>el;
root = insert(root,el);
}
Этот фрагмент кода уже занял O (NlogN) или худший O (N ^ 2).
Лучшим решением является использование pivot и разбиения на разделы, как и быстрая сортировка.
Но вместо полной сортировки массивов вы отбрасываете один раздел, который не имеет значения, и продолжаете рекурсивное разбиение только на один раздел.
Проверьте ссылку на лучшее решение для получения подробной информации.