在未排序数组中查找第二小元素的详细信息
details of finding 2nd smallest element in unsorted array
让我把事情说清楚:我想了解更多关于如何找到数组中第二小元素的"最佳"算法的实现,如下所述:
算法:从未知数组中查找第二小元素的索引
首先,我完全清楚如何找到数组中第二小元素的算法。最佳解是O(n+lg(n)-2),它可以通过首先获得最小元素S,然后搜索S的竞争对手的最小元素来实现。阅读此处:算法:从未知数组中查找第二小元素的索引
我不能理解的是如何实现它
特别是,在找到最小元素后,如何追踪最小元素的竞争对手,以便在这些竞争对手中找到第二小元素?
无需排序。快速排序是O(nlg(n)),它比O(n+lg(n)-2)更差
有太多人在谈论最佳解决方案,而没有人真正给出实现方案。此外,我发现最好的解决方案只是理论上最好的。按照"最佳"解决方案来实施它是非常困难的。
int smallest, secondsmallest;
if (array[0] < array[1]) {
smallest = array[0];
secondsmallest = array[1];
} else {
smallest = array[1];
secondsmallest = array[0];
}
for(int i = 2; i < array_size; i++) {
if (array[i] < smallest) {
secondsmallest = smallest;
smallest = array[i];
} else if (array[i] < secondsmallest) {
secondsmallest = array[i];
}
}
奇怪的是,没有人愿意给它起名字。包括最初的提问者。对于那些不熟悉它的人来说,它被称为i阶统计量,在许多优秀的算法书籍中都有讨论。对于n个元素,它实际上是O(n)(实际上是n的θ)。
您应该始终保持最小值和第二小值的运行"候选者"(可能还有它们的出现次数,取决于您对"2nd"的严格定义)。
好吧,你有点回答了自己的问题:
- 你如何跟踪最小元素?存储索引对它
- 你怎么找到第二个最小元素?再次搜索并忽略您首先找到的元素
试试这个,应该可以
min1 = a[0];
min2 = 0;
int i = 0;
for (i = 0; i < a.length; i++){
if (min1 < a[i]){
min2 = min1;
min1 = a[i];
}
}
a.length
是数组的Java实例。我不确定C++是否有相同的。
// A simple implementation with O(n) runtime complexity;
int findSecondMin(vector<int>& nums) {
if (nums.size() < 2) throw runtime_error("no second minimum !");
int min1 = nums[0], min2 = INT_MAX;
for(int i=1;i<nums.size();i++) {
if (nums[i] < min1) {
min2 = min1;
min1 = nums[i];
} else if (nums[i] < min2) {
min2 = nums[i];
}
}
return min2;
}
相关文章:
- std::extent 实现详细信息说明
- VisualC++ 2010 有没有办法找出有关未处理异常错误的更多详细信息
- 如何使用软化工具包从 OPC UA 服务器异步读取操作回调中的数据值响应中获取 NodeId 详细信息
- protobuf,如何在protobuf消息中遍历所有集合字段,我不知道详细信息?(C++)
- AVX2收集指令使用详细信息
- 只知道运行时的数据类型.如何将数据详细信息隐藏到使用它们的其他类
- CppUnit:如何立即打印故障详细信息
- 我可以为 C++ 类提供不完整的标头以隐藏实现详细信息吗?
- CPP 异常获取抛出调用方的详细信息
- 内存映射 IO 概念详细信息
- 如何在文本文件中搜索员工记录(按名称)并仅显示其详细信息?
- 使用TDD时隐藏文件访问实现详细信息
- 急需有关_doserrno(MSVC)的详细信息
- 主 - Embarcadero C++生成器 10.2 中的详细信息数据集
- 如果构造函数从调用到 std::make_shared 崩溃,GDB 是否可以显示崩溃的详细信息
- 实现 std::tuple 的详细信息
- 如何使 clang 格式将所有详细信息命名空间缩进一个
- 如何从 VisualStudio 获取更多详细信息以跟踪警告的来源
- 增加网格详细信息(附加的镶嵌)
- 在未排序数组中查找第二小元素的详细信息