簡體   English   中英

使用二叉搜索樹查找數組中的第 k 個最小元素

[英]Finding kth smallest element in an array using Binary Search Tree

問題是找到數組中的“第 K 個”最小元素。 https://practice.geeksforgeeks.org/problems/kth-smallest-element/0

現在我確實看到了給定的技術,但無法正確理解它們。 看到這個問題后,我的第一個直覺是從給定的數組創建一個 BST,並使用 BST 的 InOrder Traversal 找到數組的“第 K 個”最小元素。 這是我的方法的代碼。

/*

#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”。 幫我修復這段代碼。 這可能是我第一次獲得通過 BST 解決問題的直覺,所以我只想通過這種方法來完成這個問題。

你根本無法用 BST 解決這個問題。

問題清楚地表明預期時間復雜度: 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 並像快速排序一樣進行分區。

但是,您沒有對 arrays 進行完全排序,而是丟棄了一個不相關的分區,並僅在一個分區上遞歸地進行分區。

檢查最佳解決方案鏈接以獲取詳細信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM