【发布时间】:2008-09-23 18:25:01
【问题描述】:
对于最常见的数据结构(包括数组、链表、哈希表等)的操作,没有可用的大 O 表示法的总结。
【问题讨论】:
标签: data-structures complexity-theory big-o
对于最常见的数据结构(包括数组、链表、哈希表等)的操作,没有可用的大 O 表示法的总结。
【问题讨论】:
标签: data-structures complexity-theory big-o
有关此主题的信息现在可在 Wikipedia 上找到:Search data structure
+----------------------+----------+------------+----------+--------------+
| | Insert | Delete | Search | Space Usage |
+----------------------+----------+------------+----------+--------------+
| Unsorted array | O(1) | O(1) | O(n) | O(n) |
| Value-indexed array | O(1) | O(1) | O(1) | O(n) |
| Sorted array | O(n) | O(n) | O(log n) | O(n) |
| Unsorted linked list | O(1)* | O(1)* | O(n) | O(n) |
| Sorted linked list | O(n)* | O(1)* | O(n) | O(n) |
| Balanced binary tree | O(log n) | O(log n) | O(log n) | O(n) |
| Heap | O(log n) | O(log n)** | O(n) | O(n) |
| Hash table | O(1) | O(1) | O(1) | O(n) |
+----------------------+----------+------------+----------+--------------+
* The cost to add or delete an element into a known location in the list
(i.e. if you have an iterator to the location) is O(1). If you don't
know the location, then you need to traverse the list to the location
of deletion/insertion, which takes O(n) time.
** The deletion cost is O(log n) for the minimum or maximum, O(n) for an
arbitrary element.
【讨论】:
O(1)。关于查找要删除的元素的想法,您必须再次区分查找元素和删除元素。删除的复杂性假设您已经知道要删除的元素,这就是为什么您在已排序数组(需要移位)上使用O(n),在未排序数组上使用O(1)。
我想我将从链表的时间复杂度开始:
索引---->O(n)
在末尾插入/删除---->O(1) 或 O(n)
在中间插入/删除--->O(1) with iterator O(n) with out
最后插入的时间复杂度取决于你是否有最后一个节点的位置,如果你有,那将是 O(1) 否则你将不得不搜索链表,时间复杂度将跳转到 O(n)。
【讨论】:
1 <-> 2 <-> 3 <-> 4 并且如果我必须在 3 和 4 之间插入 5,并且我所拥有的只是指向头节点的指针(即 1),我必须在 O(n) 中遍历。我错过了什么吗?
红黑树:
【讨论】:
请记住,除非您正在编写自己的数据结构(例如 C 中的链表),否则它可能很大程度上取决于您选择的语言/框架中数据结构的实现。例如,看看benchmarks of Apple's CFArray over at Ridiculous Fish。在这种情况下,数据类型(来自 Apple 的 CoreFoundation 框架的 CFArray)实际上会根据数组中实际存在的对象数量来更改数据结构 - 在大约 30,000 个对象时从线性时间变为恒定时间。
这实际上是面向对象编程的美妙之处之一——您不需要知道它是如何工作的,只需要知道它是如何工作的,并且'它的工作原理可以根据要求而改变。
【讨论】:
没有比这更有用的了:Common Data Structure Operations:
【讨论】:
哈希表的 Amortized Big-O:
请注意,哈希算法有一个常数因子,摊销意味着实际测量的性能可能会有很大差异。
【讨论】: