尝试在Python3中寻找最优数据结构以解决一个frontier问题。我刚刚意识到使用模块bisect进行实时有序插入的复杂度不是应该的O(nlog n),而是呈指数级增长。不知道原因,所以想问问你们,万一你们知道些什么,因为我觉得这很有趣。
我认为我正在正确使用该模块,所以这不应该是我的问题。无论如何,下面是用于插入节点对象的代码,通过随机f值节点来确定插入:
在几秒钟内获取许多对象,但随后的时间不会有那么多。 Bakuriu 建议我提出这个问题,因为他在做了一些测试后,也发现这个问题很有趣,最终得出了与我相同的结果。他用来测试的代码如下:
这是他的结论:
插入10k个元素很好(80毫秒,到这一点它基本上是线性缩放[请记住它是O(nlog n),所以比线性差一点]),但插入100k个元素需要很长时间,而不是10倍。100k个元素的列表并不是很大,log(100k)等于16,所以并不是很大。
非常感谢您的帮助!
我认为我正在正确使用该模块,所以这不应该是我的问题。无论如何,下面是用于插入节点对象的代码,通过随机f值节点来确定插入:
bisect.insort(self._frontier, (node._f, node))
在几秒钟内获取许多对象,但随后的时间不会有那么多。 Bakuriu 建议我提出这个问题,因为他在做了一些测试后,也发现这个问题很有趣,最终得出了与我相同的结果。他用来测试的代码如下:
python3 -m timeit -s 'import bisect as B; import random as R;seq=[]' 'for _ in range(100000):B.insort(seq, R.randint(0, 1000000))'
这是他的结论:
插入10k个元素很好(80毫秒,到这一点它基本上是线性缩放[请记住它是O(nlog n),所以比线性差一点]),但插入100k个元素需要很长时间,而不是10倍。100k个元素的列表并不是很大,log(100k)等于16,所以并不是很大。
非常感谢您的帮助!