在未排序数组中查找第二个最小元素的详细信息

时间:2011-06-07 21:53:15

标签: c++

让我说清楚: 我想更多地了解“最佳”算法的实现如何找到数组中的第二个最小元素,如下所述:

Algorithm: Find index of 2nd smallest element from an unknown array

首先,我完全清楚ALGORITHM如何在数组中找到第二个最小元素。 最好的解决方案是O(n + lg(n)-2),这可以通过首先获得最小元素S然后搜索S的竞争者的最小元素来实现。在这里阅读: Algorithm: Find index of 2nd smallest element from an unknown array

我无法理解的是如何实现它。

特别是,在找到最小元素之后,如何追踪那些最小元素的竞争对手,以便在那些竞争对手中找到第二小元素?


无需排序。 Quicksort是O(nlg(n)),它比O(n + lg(n)-2)差。

有太多人在谈论最佳解决方案而没有人真正实施过。此外,我发现最好的解决方案只是理论上最好的。遵循“最佳”解决方案很难实现它。

6 个答案:

答案 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)

嗯,你有点回答了自己的问题:

  1. 你如何跟踪 最小元素?您存储索引 它。
  2. 你如何找到第二个 最小元素?再次搜索和 忽略你先找到的元素。

答案 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;
}