的問題是下一個:成本的算法
我們想知道一個向量的大小,我們不能使用大小(),但我們有一個函數界外球(矢量&改編,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)。看到我的回答 –