簡體   English   中英

將大樣本放在二叉搜索樹上(不平衡)

[英]Putting large sample on Binary Search Tree (not balanced)

我需要從具有超過200萬行的文件中構造一個二叉搜索樹(每行將為我提供一對密鑰/值)。 由於數據是有序的,因此如果我只讀一行,獲取鍵和val並將其添加到我的樹中,則高度將很大,因此搜索樹效率低下。 因此,我在考慮是否有一種構造此搜索樹的好方法,以使它沒有很大的高度。 我的嘗試是獲取第一個100.000個鍵,隨機播放,放在樹上等等,但是似乎效率不高。 有什么建議嗎?

PS:我必須使用不平衡的搜索樹。

謝謝 !

如果您可以多次讀取文件,則可以第一次讀取文件,並在列表中讀取1000條記錄(即每2000行一次),然后進行第一個平衡插入,因此首先將元素插入位置500,然后將兩個插入位置位置250和750,然后位置4在位置125,375,625,975,依此類推。在第一遍之后,您可以讀取整個文件(並管理重復文件)並獲得更平衡的樹。

另一種選擇是根本不使用BinarySearchTree,而是使用Array,因為數據是有序的,因此您可以使用二進制搜索(您可以檢查數組中間的值,如果得到的值更大,則可以使用列表的前半部分,如果您使用列表的后半部分,則該值較低); 但我不知道使用列表是否符合您的要求。

附帶一提,在您已經處理完排序數組時創建BST是一件瘋狂的事情,但除此之外...

如果已經給您一個排序數組,它實際上為您提供了如何構建具有最小高度的平衡BST的答案。 為了簡單起見,讓我們想象一下數組是:

[0,1,2,3,4,5,6,7,8,9,10]

在這種情況下,平衡樹的根部存儲的最佳元素是什么? 自然的答案是該列表的中間5

因此,我們剩下了數組的兩個子范圍:

i<5: [0,1,2,3,4]
i>5: [6,7,8,9,10]

那么,存儲在左孩子身上的理想元素是什么? 同樣,我們以左側子列表的中心( i<5 )為中心,即2 ,並且該數組有兩個子范圍:

i<2: [0,1]
i>2: [3,4]

我們可以遞歸地重復此邏輯,直到我們剩下一個孩子或兩個范圍都沒有孩子為止,此時我們已經創建了一個葉子節點。

遞歸應用於每個分支的兩側,向下鑽取到葉子,這將為您提供最佳的平衡樹。

暫無
暫無

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

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