void List::searchInterpolation(int id){
Node* low = head;
Node* mid;
Node* high = tail;
int lowest = 0;
int middle;
int highest = getLength()-1;
int counter = 0;
while (low->getDato()->getId() <= id && high->getData()->getId() >= id){
middle = lowest + (id - low->getData()->getId()) * (highest - lowest) /
(high->getData()->getId() - low->getData()->getId());
while (middle != counter){
mid = low->getNext();
counter++;
if (mid->getData()->getId() < id){
low = mid;
} else if (mid->getData()->getId() > id){
high = mid;
} else{
cout <<"1"<<endl;
}
if (low->getData()->getId() == id){
cout<<"1"<<endl;
} else{
cout<<"-1"<<endl;
}
}
}
}
嗯,这就是我想出来的。我测试了它,似乎有一个无限循环。它开始给我-1和1无处不在。
答案 0 :(得分:0)
首先,您必须找到列表的大小。这将需要遍历列表,可能否定插值搜索的任何好处,除非您的比较缓慢。
现在,使用插值算法查找索引。从mid
推进low
到此为止。现在确定目标值是否小于或大于mid
并相应地设置low = mid
或high = mid
。重复,直到找到目标值。您应该能够跟踪剩余范围的大小,而无需再次遍历它。