最有效地查找数组中的最小值

时间:2009-06-25 07:00:38

标签: c++ arrays

数组中有N个值,其中一个值是最小值。如何最有效地找到最小值?

13 个答案:

答案 0 :(得分:37)

如果它们没有被排除,你可以做很多但是看看每一个,这是O(N),当你完成后你就会知道最低限度。


的伪代码:

small = <biggest value> // such as std::numerical_limits<int>::max
for each element in array:
    if (element < small)
        small = element

Ben提醒我的一个更好的方法就是用第一个元素初始化small:

small = element[0]
for each element in array, starting from 1 (not 0):
    if (element < small)
        small = element

以上内容包含在algorithm标题中std::min_element


如果您可以在添加项目时对阵列进行排序,那么找到它将是O(1),因为您可以保持最小的位置。

这与数组一样好。

答案 1 :(得分:9)

stl包含一系列应根据问题使用的方法。

std::find
std::find_if
std::count
std::find
std::binary_search
std::equal_range
std::lower_bound
std::upper_bound

现在它包含您的数据使用的算法。 这个Artikel包含一个完美的表格,可帮助您选择正确的算法。


在特殊情况下,应确定min max并使用std :: vector或??? * array

std::min_element
std::max_element

可以使用。

答案 2 :(得分:6)

你需要在数组中循环,记住你到目前为止看到的最小值。像这样:

int smallest = INT_MAX;
for (int i = 0; i < array_length; i++) {
    if (array[i] < smallest) {
        smallest = array[i];
    }
}

答案 3 :(得分:6)

如果您想要真正有效并且有足够的时间花费,请使用SIMD指令。

您可以在一条指令中比较几对:

r0 := min(a0, b0)
r1 := min(a1, b1)
r2 := min(a2, b2)
r3 := min(a3, b3)
__m64 _mm_min_pu8(__m64 a , __m64 b );

今天每台计算机都支持它。其他已经为你编写了min函数:

http://smartdata.usbid.com/datasheets/usbid/2001/2001-q1/i_minmax.pdf

或使用已准备好的library

答案 4 :(得分:3)

如果数组按升序或降序排序,那么您可以找到复杂度为O(1)的数组。 对于升序数组,第一个元素是最小元素,您可以通过arr [0](基于0的索引)获得它。 如果数组按降序排序,那么最后一个元素是最小的元素,你可以通过arr [sizeOfArray-1]得到它。

如果数组没有排序,那么你必须迭代数组以获得最小元素。在这种情况下,时间复杂度为O(n),这里n是数组的大小。

int arr[] = {5,7,9,0,-3,2,3,4,56,-7};
int smallest_element=arr[0] //let, first element is the smallest one

for(int i =1;i<sizeOfArray;i++)  
{
    if(arr[i]<smallest_element)
    {
     smallest_element=arr[i];
    }
}

您可以在输入部分计算它(当您必须找到给定数组中的最小元素时)

int smallest_element;
int arr[100],n;
cin>>n;
for(int i = 0;i<n;i++)
{
cin>>arr[i];
if(i==0)
{
    smallest_element=arr[i]; //smallest_element=arr[0];
}
else if(arr[i]<smallest_element)
{
smallest_element = arr[i];
}
}

你也可以通过内置功能获得最小元素

#inclue<algorithm>
int smallest_element = *min_element(arr,arr+n); //here n is the size of array

使用此功能可以获得任何范围的最小元素 比如,

int arr[] = {3,2,1,-1,-2,-3};
cout<<*min_element(arr,arr+3); //this will print 1,smallest element of first three element
cout<<*min_element(arr+2,arr+5); // -2, smallest element between third and fifth element (inclusive) 

我在min_element()函数之前使用过星号(*)。因为它返回最小元素的指针。 所有代码都是c ++。 你可以用相反的方式找到最大元素。

答案 5 :(得分:0)

O(1)溶解可能只是猜测:阵列中最小的数字通常为0 0。鉴于您只是在查看无符号数字。但即便如此:0还不错。此外,查看最小数字的所有元素是一个真正的痛苦。为什么不使用0?它实际上可能是正确的结果!

如果面试官/您的老师不喜欢这个答案,请尝试1,2或3.他们最终也会参加大多数家庭作业/面试场景数字阵列......

更严重的一面:您需要多长时间在阵列上执行此操作?因为上面的解决方案都是O(n)。如果你想对列表进行m次,你将一直添加新的元素,为什么不预先花一些时间来创建一个堆呢?然后找到最小的元素可以在O(1)中完成,而不会导致作弊。

答案 6 :(得分:0)

如果找到最小值是一次性的事情,只需遍历列表并找到最小值。

如果找到最小值是非常常见的,并且您只需要在最小值上运行,请使用堆数据结构。

堆将比在列表上进行排序更快,但权衡是你只能找到最小值。

答案 7 :(得分:0)

如果您正在开发某种类型的自己的数组抽象,那么如果您在附加属性中存储最小的附加值,则可以获得O(1),并在每次将新项目放入数组时进行比较。

看起来应该是这样的:

class MyArray
{
public:
    MyArray() : m_minValue(INT_MAX) {}

    void add(int newValue)
    {
        if (newValue < m_minValue) m_minValue = newValue;
        list.push_back( newValue );
    }

    int min()
    {
        return m_minValue;
    }

private:
    int m_minValue;
    std::list m_list;
}

答案 8 :(得分:0)

里奇的答案很接近。这取决于语言。这是一个很好的java解决方案:

int smallest =  Integer.MAX_VALUE;
int array[]; // Assume it is filled.
int array_length = array.length;
for (int i = array_length - 1; i >= 0; i--) {
    if (array[i] < smallest) {
        smallest = array[i];
    }
}

我以相反的顺序遍历数组,因为在循环比较中比较“i”和“array_length”需要获取和比较(两个操作),而比较“i”到“0”是单个JVM字节码操作。如果在循环中完成的工作可以忽略不计,那么循环比较会占用相当大的时间。

当然,其他人指出封装阵列和控制插入将有所帮助。如果获得所需的最小值,则无需按列出的顺序保留列表。只保留一个包含目前为止最小插入的实例变量,并将其与添加到数组中的每个值进行比较。 (当然,如果删除元素,则会失败。在这种情况下,如果删除当前最低值,则需要扫描整个数组以找到新的最低值。)

答案 9 :(得分:0)

//find the min in an array list of #s
$array = array(45,545,134,6735,545,23,434);

$smallest = $array[0];
for($i=1; $i<count($array); $i++){
    if($array[$i] < $smallest){
        echo $array[$i];
    }
}

答案 10 :(得分:0)

                //smalest number in the array//
    double small = x[0];
    for(t=0;t<x[t];t++)
    {
         if(x[t]<small)
             {
                small=x[t];
            }
    }
    printf("\nThe smallest number is  %0.2lf  \n",small);

答案 11 :(得分:0)

步骤:

我们可以使用min_element(array, array+size)功能。但它是迭代者 返回最小元素的地址。如果我们使用*min_element(array, array+size),那么它将返回数组的最小值。

C ++实现

  #include<bits/stdc++.h>
  using namespace std;

  int main()
  {
     int num;
     cin>>num;
     int arr[10];

     for(int i=0; i<num; i++)
     {
       cin>>arr[i];
     }


    cout<<*min_element(arr,arr+num)<<endl;

    return 0;
  }

答案 12 :(得分:-2)

int small=a[0];
for (int x: a.length)
{
    if(a[x]<small)
        small=a[x];
}