是搜索未排序数组进行元素线性搜索的最快算法吗?我的意思是我猜合并排序+二进制搜索的组合会更慢。还有其他选择吗? (就不涉及多线程的算法而言)?
答案 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)作为向量的索引,并推送这些元素。
现在要搜索元素,我仅遍历向量的特定索引中存在的元素。
这样,比较次数就更少了。