让我说清楚: 我想更多地了解“最佳”算法的实现如何找到数组中的第二个最小元素,如下所述:
首先,我完全清楚ALGORITHM如何在数组中找到第二个最小元素。 最好的解决方案是O(n + lg(n)-2),这可以通过首先获得最小元素S然后搜索S的竞争者的最小元素来实现。在这里阅读: Algorithm: Find index of 2nd smallest element from an unknown array
我无法理解的是如何实现它。
特别是,在找到最小元素之后,如何追踪那些最小元素的竞争对手,以便在那些竞争对手中找到第二小元素?
有太多人在谈论最佳解决方案而没有人真正实施过。此外,我发现最好的解决方案只是理论上最好的。遵循“最佳”解决方案很难实现它。
答案 0 :(得分:3)
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];
}
}
答案 1 :(得分:1)
奇怪的是,没有人愿意给它这个名字。包括原始提问者。对于那些不熟悉它的人来说,它被称为 i 顺序统计,并在许多精细的算法书籍中进行了讨论。对于n个元素,确实是O(n)(实际上是n的n)。
答案 2 :(得分:0)
你应该保持正在运行的“候选人”(可能是他们的出现次数,取决于你对“第二次”的严格定义),以及最小和最小值。
答案 3 :(得分:0)
嗯,你有点回答了自己的问题:
答案 4 :(得分:0)
试试这个,应该有效
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 ++是否有相同的。
答案 5 :(得分:0)
// 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;
}