有没有办法在少于 O(n) 的时间内找到集合中的最小元素?
Posted
技术标签:
【中文标题】有没有办法在少于 O(n) 的时间内找到集合中的最小元素?【英文标题】:Is there a way to find minimum element in a set in less than O(n) time? 【发布时间】:2022-01-09 01:51:54 【问题描述】:我正在尝试使用 min() 从 python 中的集合中获取最小值。
约束:
-
我正在使用一个字典,它将一个节点映射到一个值,但这个字典会不断更新。
我正在不断减小集合的大小。
我的集合有 510650 个元素。
current = min(unvisited, key=lambda node: distanceTo[node])
.
字典名称是'distanceTo'。
集合的名称是“未访问”。
【问题讨论】:
如果没有排序的数据结构,您必须查看每个元素才能找到最小值 一个python集是完全未排序的,所以没有。当然,有一些方法可以创建有序集合(这是 c++ 中的默认设置),这意味着添加或查找元素需要更长的时间,但您可以在 O(1) 中获得最小值。 更新distanceTo
时为什么不更新current
?
如果你想为几何 TSP 做最近邻之类的事情,请参阅this question 了解一些想法。
【参考方案1】:
如果我正确理解 big-o 表示法,我不相信。
“O(n) 表示处理时间随着输入的大小线性增加”
如果您从逻辑上考虑,对于添加到未排序列表中的每个项目,您需要再比较一个元素以查看它是否满足您的特定要求(在您的情况下,具有最小值)
https://en.wikipedia.org/wiki/Time_complexity#Linear_time
编辑: 当然,如果某人只是想在一个列表中找到一个特定的值,而该值恰好在他开始搜索的开头,那么在不到 O(n) 的时间内就可以找到它;可能不相关,但我觉得值得一提。
【讨论】:
以上是关于有没有办法在少于 O(n) 的时间内找到集合中的最小元素?的主要内容,如果未能解决你的问题,请参考以下文章