我想知道什么是最好的:数组或二进制搜索树(插入,删除,查找最大和最小)以及如何改进它们?
答案 0 :(得分:14)
数组允许random access到其中的每个元素。所以你可以在O(1)
中插入,删除和查找特定元素,并在O(n)
中删除最大/最小值。 [您还可以制作最高/分钟O(1)
并删除O(n)
。如果您对数组进行排序,则会导致插入/删除为O(n)
,但您将获得O(logn)
find,O(1)
min / max。
按照定义对 BST 进行排序,对于常规[不平衡] BST,您会遇到O(n)
最坏情况行为。对于平衡BST ,您可以O(logn)
插入/删除/查找。你可以得到O(1)
min / max两种方式。
由于您获得了更好的iterate性能,因此数组通常也更快cache [假设迭代次序并不重要]。此外,与BST不同,BST本质上具有无限大小,当数组已满时,数组需要重新分配和复制数据。
改善 BST可以通过balanced - AVL或red-black-trees来完成。
哪个更好?这取决于应用程序。通常,当您计划插入数据并对其进行排序时,BST将是首选。如果随机访问或迭代是主要目的:通常使用数组。
答案 1 :(得分:13)
数组和二进制搜索树的性能比较:
Array Binary search tree
Unsorted Sorted Average Worst case
Space O(n) O(n) O(n) O(n)
Search O(n) O(log n) * O(log n) O(n)
Max/Min O(n) O(1) O(1) ** O(1) **
Insert O(1) O(n) O(log n) O(n)
Delete O(1) O(n) O(log n) O(n)
*
假设二元搜索
**
需要额外指向min和max的指针,否则它是O(log n)