假设我有一组数据(未排序),我想存储以便快速查找。在加载数据之前,我不知道大小是多少,我应该立即加载它,这样我就可以立即开始执行查找。
此外,在程序执行期间的任何时候,可以向我呈现更多数据以存储在我选择的数据结构中。
我应该使用哈希表还是排序数组来存储这些数据?显然,静态哈希表需要根据提供的数据大小在运行时制作 - 这是否足以让我只需对给出的数据进行排序,即使它是O(NlogN)而不是O( N)?或者我应该考虑一些动态哈希的方法吗?
澄清:我需要加载任意大小的数据,然后对数据执行搜索和插入,没有明确的顺序或想法我将不得不做的搜索/插入量。
我知道这很普遍......但是如果我在加载数据后需要进行更多的插入而不是搜索呢?比插入更多的搜索呢?
答案 0 :(得分:9)
这实际上取决于操作的频率。
如果相对于查找次数进行大量插入,那么排序数组可能不是一个好选择,因为插入排序数组是很昂贵的(O(n)时间)。这里可能需要二进制搜索树或哈希表。
如果相对于插入次数进行了大量的查找,那么排序的数组可能是个好主意,尽管哈希表可能更快。
< / LI>如果您的密钥属于某些类型(整数,字符串等),您可以使用更具体的数据结构,如trie或van Emde Boas tree,以获得额外的性能。这些有时是比哈希表或排序数组更好的选择,因为它们可以利用数据的细节。
如果你真的不知道会发生什么,我会使用哈希表作为初始实现。它不太可能是一个糟糕的选择,尽管可能会有一个更精细的数据结构,你可以使用它。如果您事先不知道使用模式,那么排序后的数组不太可能是个好主意。
希望这有帮助!
答案 1 :(得分:5)
Templatetypedef的答案很明显,但我会在RedBlack树上添加更多信息,这些信息在两个选项之间提供了很好的折衷。他提到了尝试和vEB树(之前没有听说过后者,听起来很有用!)RedBlack树不如那些选项优化,但可能是更通用的解决方案。当然值得研究这些更优雅的树结构选项以及列表或哈希映射。
RedBlack Tree:
Insertion: O(log n)
Key Lookup: O(log n)
Key Search: O(log n)
Iteration: O(n)
Sorted List:
Insertion: O(n log n)
Index Lookup: O(1)
Sorted Search: O(log n)
Iteration: O(n)
Hash Table:
Insertion: O(1)
Key Lookup: O(1)
Key Search: O(n)
Iteration: O(n)