#include <iostream>
#include <vector>
using namespace std;
int square(int num) {
return num * num;
}
template<typename T>
void print_v(vector<T> v)
{
cout << "v out:" << endl;
for(auto item = v.begin(); item != v.end(); ++item)
{
cout << *item << " ";
}
cout << endl;
}
int SequentialSearch(vector<int>& v, int key)
{
for(int i=0; i< v.size();i++)
{
if (v[i] == key)
{
return i;
}
}
return -1;
}
int BinarySearch(vector<int>& v, int key)
{
int low = 0;
int high = v.size();
while(low < high)
{
//int mid = (high - low)/2;
int mid = low + (high - low)*(key -v[low])/(v[high] - v[low]);
if(key == v[mid])
{
return mid;
}
else if(key < v[mid])
{
high = mid-1;
}
else
{
low = mid+1;
}
}
return -1;
}
void GenFibonacci(vector<int>& fv, int max)
{
if (fv.size()<2)
{
fv.push_back(0);
fv.push_back(1);
}
auto v_size = fv.size();
if (fv[v_size-1] >= max)
return;
fv.push_back(fv[v_size -2] + fv[v_size - 1]);
GenFibonacci(fv, max);
}
int FibonacciSearch(vector<int>& sv, int key)
{
int n = sv.size();
vector<int> fv;
GenFibonacci(fv, sv.size());
print_v<int>(fv);
int k = fv.size()-1;
while(sv.size() < fv[k-1]-1)
{
sv.push_back(*sv.rbegin());
}
print_v<int>(sv);
int low = 0;
int high = sv.size();
while(low <= high)
{
int mid = low + fv[k-1]-1;
cout << mid << " " << sv[mid] << " " << low << " "<< high << endl;
if(key < sv[mid])
{
high = mid - 1;
k = k - 1;
}
else if(key > sv[mid])
{
low = mid + 1;
k = k - 2;
}
else
{
if (mid < n)
return mid;
else
return n;
}
}
return -1;
}
int main() {
vector<int> v1 = {1,2,4,5,7,8,9,10};
auto index = FibonacciSearch(v1, 11);
cout << "index: " << index << endl;
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgoJCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgppbnQgc3F1YXJlKGludCBudW0pIHsKICAgIHJldHVybiBudW0gKiBudW07Cn0KCnRlbXBsYXRlPHR5cGVuYW1lIFQ+CnZvaWQgcHJpbnRfdih2ZWN0b3I8VD4gdikKewogICAgY291dCA8PCAidiBvdXQ6IiA8PCBlbmRsOwogICAgZm9yKGF1dG8gaXRlbSA9IHYuYmVnaW4oKTsgaXRlbSAhPSB2LmVuZCgpOyArK2l0ZW0pCiAgICB7CiAgICAgICAgY291dCA8PCAqaXRlbSA8PCAiICI7CiAgICB9CiAgICBjb3V0IDw8IGVuZGw7Cn0KCmludCBTZXF1ZW50aWFsU2VhcmNoKHZlY3RvcjxpbnQ+JiB2LCBpbnQga2V5KQp7Cglmb3IoaW50IGk9MDsgaTwgdi5zaXplKCk7aSsrKQoJewoJCWlmICh2W2ldID09IGtleSkKCQl7CgkJCXJldHVybiBpOwoJCX0KCX0KICAgIHJldHVybiAtMTsKfQoKaW50IEJpbmFyeVNlYXJjaCh2ZWN0b3I8aW50PiYgdiwgaW50IGtleSkKewogICAgaW50IGxvdyA9IDA7CiAgICBpbnQgaGlnaCA9IHYuc2l6ZSgpOwogICAgd2hpbGUobG93IDwgaGlnaCkKICAgIHsKICAgICAgICAvL2ludCBtaWQgPSAoaGlnaCAtIGxvdykvMjsKICAgICAgICBpbnQgbWlkID0gbG93ICsgKGhpZ2ggLSBsb3cpKihrZXkgLXZbbG93XSkvKHZbaGlnaF0gLSB2W2xvd10pOwogICAgICAgIGlmKGtleSA9PSB2W21pZF0pCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gbWlkOwogICAgICAgIAogICAgICAgIH0KICAgICAgICBlbHNlIGlmKGtleSA8IHZbbWlkXSkKICAgICAgICB7CiAgICAgICAgICAgIGhpZ2ggPSBtaWQtMTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgbG93ID0gbWlkKzE7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIC0xOwp9Cgp2b2lkIEdlbkZpYm9uYWNjaSh2ZWN0b3I8aW50PiYgZnYsIGludCBtYXgpCnsKICAgIGlmIChmdi5zaXplKCk8MikKICAgIHsKICAgICAgICBmdi5wdXNoX2JhY2soMCk7CiAgICAgICAgZnYucHVzaF9iYWNrKDEpOwogICAgfQogICAgYXV0byB2X3NpemUgPSBmdi5zaXplKCk7CiAgICBpZiAoZnZbdl9zaXplLTFdID49IG1heCkKICAgICAgICByZXR1cm47CiAgICBmdi5wdXNoX2JhY2soZnZbdl9zaXplIC0yXSArIGZ2W3Zfc2l6ZSAtIDFdKTsKICAgIEdlbkZpYm9uYWNjaShmdiwgbWF4KTsKfQoKCmludCBGaWJvbmFjY2lTZWFyY2godmVjdG9yPGludD4mIHN2LCBpbnQga2V5KQp7CiAgICBpbnQgbiA9IHN2LnNpemUoKTsKICAgIHZlY3RvcjxpbnQ+IGZ2OwogICAgR2VuRmlib25hY2NpKGZ2LCBzdi5zaXplKCkpOwogICAgcHJpbnRfdjxpbnQ+KGZ2KTsKICAgIGludCBrID0gZnYuc2l6ZSgpLTE7CiAgICB3aGlsZShzdi5zaXplKCkgPCBmdltrLTFdLTEpCiAgICB7CiAgICAgICAgc3YucHVzaF9iYWNrKCpzdi5yYmVnaW4oKSk7CiAgICB9CiAgICBwcmludF92PGludD4oc3YpOwogICAgaW50IGxvdyA9IDA7CiAgICBpbnQgaGlnaCA9IHN2LnNpemUoKTsKICAgIHdoaWxlKGxvdyA8PSBoaWdoKQogICAgewogICAgICAgIGludCBtaWQgPSBsb3cgKyBmdltrLTFdLTE7CiAgICAgICAgY291dCA8PCBtaWQgPDwgIiAiICA8PCBzdlttaWRdIDw8ICIgIiA8PCBsb3cgPDwgIiAiPDwgaGlnaCA8PCBlbmRsOwogICAgICAgIGlmKGtleSA8IHN2W21pZF0pCiAgICAgICAgewogICAgICAgICAgICBoaWdoID0gbWlkIC0gMTsKICAgICAgICAgICAgayA9IGsgLSAxOwogICAgICAgIH0KICAgICAgICBlbHNlIGlmKGtleSA+IHN2W21pZF0pCiAgICAgICAgewogICAgICAgICAgICBsb3cgPSBtaWQgKyAxOwogICAgICAgICAgICBrID0gayAtIDI7CiAgICAgICAgfQogICAgICAgIGVsc2UKICAgICAgICB7CiAgICAgICAgICAgIGlmIChtaWQgPCBuKQogICAgICAgICAgICAgICAgcmV0dXJuIG1pZDsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgcmV0dXJuIG47CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIC0xOwp9CgoKaW50IG1haW4oKSB7Cgl2ZWN0b3I8aW50PiB2MSA9IHsxLDIsNCw1LDcsOCw5LDEwfTsKCWF1dG8gaW5kZXggPSBGaWJvbmFjY2lTZWFyY2godjEsIDExKTsKCWNvdXQgPDwgImluZGV4OiAiIDw8IGluZGV4IDw8IGVuZGw7CglyZXR1cm4gMDsKfQ==