有没有办法在少于 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) 的时间内找到集合中的最小元素?的主要内容,如果未能解决你的问题,请参考以下文章

java - 如何使用PriorityQueue集合从Java中的给定数组在O(n)时间内构建最大堆?

我如何找到从任何节点到集合A的最短路径

有没有办法在 O(n) 时间内打印字符串的所有子字符串?

在 O(n) 时间内找到数组中的 10 个最大整数

在 O(n) 时间内找到数组中的重复元素

我们如何在 O(n) 时间和 O(1) 空间复杂度内找到数组中的重复数字