有 100W 个数,有一个函数是可以高效查找并删除某个数,问应该用什么数据结构去存这 100W 个数
问题
有 100W 个数,有一个函数是可以高效查找并删除某个数,问应该用什么数据结构去存这 100W 个数
我的回答
首先,哈希表(HashSet/HashMap)是一个很好的选择。在平均情况下,哈希表的查找和删除操作时间复杂度都是O(1),非常高效。对于100万个数据,现代计算机的内存完全足够存储哈希表。不过哈希表有个缺点,就是在最坏情况下(哈希冲突严重时),性能可能退化到O(n),但这种情况在实际应用中比较少见,现代哈希表实现通常会采用各种策略来减少冲突。
另一个选择是平衡二叉搜索树,比如红黑树、AVL树,或者C++中的std::set、Java中的TreeSet。这些数据结构的查找和删除操作时间复杂度都是O(log n),对于100万个数据,大约需要log₂(10⁶)≈20次比较,也是相当高效的。平衡树的优势在于它能保证最坏情况下的性能,而且可以保持元素的有序性,如果后续操作需要有序访问数据,这会很有用。
如果数据范围有限且比较集中,比如都是0到10⁷范围内的整数,那么位图(Bitmap)也是个不错的选择。位图用一个bit位表示一个数是否存在,查找和删除都是O(1)的,而且空间效率极高。不过位图只适用于数据范围有限且没有重复的情况。如果数据有重复,可以用计数位图(每个位置不是0/1,而是计数器)
如果内存有限而且数据量特别大,可以考虑布隆过滤器(Bloom Filter),它是一种空间效率很高的概率型数据结构,用于判断一个元素是否在集合中。不过布隆过滤器有一定的误判率,而且不支持删除操作(除非使用计数布隆过滤器)。