1 回答
TA贡献1943条经验 获得超7个赞
有趣的是,您发布了计算机的时钟速度 - 您可以计算算法所需的实际步骤数……但是您需要对实现有很多了解。例如,在 python 中,每次创建对象或超出范围时,解释器都会更新底层对象上的计数器,如果这些 ref 计数达到 0,则释放内存。相反,您应该查看相对速度。
您发布的第三方示例显示,当输入数组长度加倍时,速度小于加倍。好像不太对吧?事实证明,对于这些示例,构建数组的初始工作可能支配了对数组进行排序所花费的时间!
在您的代码中,已经有一条注释指出了我要说的内容...
heap.remove(heap.heap[i])
此操作将遍历您的列表(从索引 0 开始)寻找匹配的值,然后将其删除。这已经很糟糕了(如果它按预期工作,如果您的代码按预期工作,您将在该行上进行 320k 比较!)。但情况更糟——从数组中删除一个对象不是就地修改——删除对象后的每个对象都必须在列表中向前移动。最后,不能保证您确实删除了那里的最后一个对象……可能存在重复值!
这是一个有用的网站,列出了 python 中各种操作的复杂性 - https://wiki.python.org/moin/TimeComplexity。为了尽可能高效地实现算法,您需要尽可能多的数据结构操作为 O(1)。这是一个例子......这是一些原始代码,大概是heap.heap是一个列表......
output = [heap.heap[i]] + output heap.remove(heap.heap[i])
正在做
output.append(heap.heap.pop())
将避免分配新列表并使用恒定时间操作来改变旧列表。(向后使用输出比使用 O(n) 时间 insert(0) 方法要好得多!如果您确实需要订单,您可以使用出队对象进行输出以获得 appendleft 方法)
如果您发布了整个代码,那么我们可能会提供很多其他的小东西。希望这有帮助!
添加回答
举报