[英]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.