-1

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

4

2 回答 2

5

是的,如果数组是未排序的并且这就是你所知道的关于它的结构,那么搜索一个元素的最快方法是考虑每一个需要线性时间O(n)的元素。

如果您要大量搜索数组,那么您可能需要考虑进行初始排序,然后将元素插入到正确的排序索引中(使用二进制搜索)。这意味着您的初始排序为O(n log n)但每次插入和搜索都需要O(log n)。这都是关于权衡以及这是否比O(1)插入和O(n)搜索更好。

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

于 2013-03-18T07:17:02.447 回答
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)作为向量的索引并推送这些元素。现在要搜索元素,我只遍历向量的特定索引中存在的元素。
这样,比较的次数就少了。

于 2020-03-04T16:09:14.720 回答