我想把已经写好的Python代码翻译成C++或其他更快速的语言,因为Python并不够快以完成我想做的事情。但是,所涉及的代码滥用了Python集合的一些卓越特性,特别是平均O(1)成员测试,这在关键性能循环中被频繁使用,我不确定如何在另一种语言中实现Python集合。
在Python的时间复杂度维基页面上,它指出集合具有平均O(1)的成员测试和最坏的情况O(n)。我亲自使用
我假设
在Python的时间复杂度维基页面上,它指出集合具有平均O(1)的成员测试和最坏的情况O(n)。我亲自使用
timeit
进行了测试,惊讶于Python集合执行成员测试的极快速度,即使N很大。我查看了此Stack Overflow答案,看看当使用find
操作来查找给定集合中的元素是否是成员时,C++集合的表现如何,它说它是O(log(n))。我假设
find
的时间复杂度是对数级别的,因为C ++ std库集合是用某种二叉树实现的。我认为这是因为Python集合具有平均O(1)成员测试和最坏情况O(n),它们可能是使用带有桶的某种关联数组实现的,可以轻松查找元素并测试其是否为一些指示该元素不是集合一部分的虚拟值。
问题在于,我不想通过切换到另一种语言来减慢代码的任何部分(因为这是我试图解决的问题),那么我如何在另一种语言中实现自己的Python集合版本(仅特别快速的成员测试)? 有人知道Python集合的实现方式吗?如果不知道,是否有人能给我任何一般提示以指引我正确的方向?
我不需要源代码,只需要一般想法和链接,以帮助我入门。
我已经对关联数组进行了一些研究,我认为我理解了它们实现背后的基本思想,但我不确定它们的内存使用情况。如果Python集合确实只是真正的关联数组,那么我如何以最小的内存使用实现它们?
额外说明:我想使用的这些集合将具有高达50,000个元素,并且集合中的每个元素都将在一个大范围内(例如[-999999999,999999999])。
std::unordered_set
。然而,50000个元素并不算太多,使用标准的std::set
只需要不到16次比较就可以完成查找。 - Oliver Charlesworth