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

details of finding 2nd smallest element in unsorted array

本文关键字:元素 详细信息 查找 排序 数组      更新时间:2023-10-16

让我把事情说清楚:我想了解更多关于如何找到数组中第二小元素的"最佳"算法的实现,如下所述:

算法:从未知数组中查找第二小元素的索引

首先,我完全清楚如何找到数组中第二小元素的算法。最佳解是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"的严格定义)。

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

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

试试这个,应该可以

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