查找元素是否存在于未排序数组中的最快方法?

时间:2013-03-18 07:15:38

标签: arrays sorting search merge linear

是搜索未排序数组进行元素线性搜索的最快算法吗?我的意思是我猜合并排序+二进制搜索的组合会更慢。还有其他选择吗? (就不涉及多线程的算法而言)?

2 个答案:

答案 0 :(得分:4)

是的,如果数组是未排序的并且你对它的结构知之甚少,那么搜索元素的最快方法是考虑每个线性时间 O(n)

如果您要搜索数组,那么您可能需要考虑初始排序,然后将元素插入正确的排序索引(使用二进制搜索)。这意味着您的初始排序为 O(n log n),但每次插入和搜索都需要 O(log n)。这完全取决于权衡,是否优于 O(1)插入和 O(n)搜索。

你说没有多线程,但这是一种提高性能的简单方法,让多个线程查看列表中的不同块。

答案 1 :(得分:0)

我创建了一种用于搜索未排序数组中元素的方法。

#include <iostream> 
#include <vector> // for 2D vector 
#include<bits/stdc++.h>
using namespace std; 

int main() 
{ 
    vector<vector<int>> vect{ {0},{0},{0},{0},{0},{0},{0},{0},{0},{0} }; 
    int count[10];
    int min = INT_MAX; 
    int max = INT_MIN;   
    for (int i = 0; i < 10; i++)
    {
        count[i] = 0;
    }

    for (int i = 0; i < 7; i++)
    {
        //input 7 integers
        int ip,
            rem;
        cin >> ip;
        rem = ip % 10;
        if (ip > max)
            max = ip;
        if (min > ip)
            min = ip;
        if (vect[rem][0] == 0 && count[rem] == 0)
        {
            vect[rem][0] = ip;
            count[rem]++;
        }
        else
        {
            vect[rem].push_back(ip);
            count[rem]++;
        }
    }

    int find;
int flag = 0;
    cin >> find;
    int rem = find % 10;
    if (find>max || find<min || count[rem] == 0)
        cout<<"not present in the array";
    else
    {
        for (int i = 0; i < vect[rem].size(); i++)
        {
            if (vect[rem][i] == find)
            {
                cout << "found";flag = 1;
                break;
            }
        }
      if(flag == 0)
        cout<<"not present in the array";
    }

    return 0; 
}

我看到这可以更快。 基本上,一旦收到元素,我就会将元素存储在2D向量中。

我将其余的数字(数字%10)作为向量的索引,并推送这些元素。 现在要搜索元素,我仅遍历向量的特定索引中存在的元素。
这样,比较次数就更少了。