的问题是下一个:成本的算法
我们想知道一个向量的大小,我们不能使用大小(),但我们有一个函数界外球(矢量&改编,INT指数)如果索引是向量的有效位置,则返回true。
所以,我的方法是迭代位置。从1开始并复制(2,4,8,16,32 ...),直到inBounds返回false,退回,然后在子范围内重复搜索。
让我们做一个例子,把N = 21:
- 1 =真
- 2 =真
- 4 =真
- 8 =真
- 16 =真
- 32 =假
Step ba CK至16,和在16-32范围查询:
- (16 + 1)= TRUE
- (16 + 2)= TRUE
- (16 + 4)= TRUE
- (16 8)= FALSE
步骤返回到20(16 + 4),并开始了:
- (20 + 1)= TRUE
- (20 + 2)= FALSE
在21重新开始:
- (21 + 1)= FALSE
好了,所以大小为21。
这是我在代码中的实现:
#include <iostream>
#include <vector>
using namespace std;
int inBounds(const vector<int>& arr,int i)
{
return i < arr.size();
}
int size(const vector<int>& arr)
{
int init = 0;
while (inBounds(arr,init))
{
int start = 2;
while (inBounds(arr,init+start))
{
start *= 2;
}
start /= 2;
init += start;
}
return init;
}
int main()
{
vector<int> arr;
for (int i = 0;i < 1000;i++)
{
arr.resize(i);
int n = size(arr);
if (n != arr.size())
cout << "FAIL " << arr.size() << ' ' << n << endl;
}
return 0;
}
这很好用。但是我不知道这个算法的确切成本。第一次搜索确实是日志(N),但现在我需要添加子范围搜索。所以我有我的怀疑关于真正的成本
这是一个奇怪的方法来做到这一点。我会在最高一级循环中加倍,以确定上限。然后,在顶级循环中,您可以使用[二进制搜索](https://en.wikipedia.org/wiki/Binary_search_algorithm)。总而言之,你将拥有'2×O(log(N))= O(log(N))' –
你的算法的复杂性是O(log * log)。看到我的回答 –