如果我有一个数字列表,其中数字增加到一个点然后在该点之后减少,是否存在有限数量的猜测,而不管我为了找到最大值而必须进行的集合的大小值?
值之间的距离是任意的,增加值的值的数量可以与减少值的值的数量不同。
最好的方法是什么?检查元素1,然后检查最后一个元素,然后检查一半?并重复?还是更复杂的东西?
这种算法的处理时间是多少?
答案 0 :(得分:0)
您可以使用二进制搜索将两个相邻元素而不是一个元素比较为固定值。从a:= 0开始,b:= n,i:=(a + b)/ 2,并将元素(i)与元素(i + 1)进行比较。如果你注意到e(i + 1)> e(i),你知道断点在我之后的某个地方,所以设置一个:= i。如果e(i)< e(i-1),反之亦然,你设置b:= i。
复杂性将为O(log n)。它会比常规二进制搜索稍慢,因为你需要更多的比较。
答案 1 :(得分:0)
您可以根据列表中的元素数量尝试一种与有序搜索相似的递归算法。
伪代码:
List search(int index, List listpart){
if(listpart.length()==1){ // already found
return listpart
}
else if(listpart(index+1)>listpart(i) && listpart(index-1)<listpart(i)){ //search right part
List listpart_tmp = getlistpart(listpart, index, listpart.length())
return search(index+(listpart.length()/4), listpart_tmp
}
else if(listpart(index+1)<listpart(i) && listpart(index-1)>listpart(i)){ //search left part
List listpart_tmp = getlistpart(listpart, 0, index)
return search(index-(listpart.length()/4), listpart_tmp
}
else if(listpart(index+1)<listpart(i) && listpart(index-1)<listpart(i)){ //found
return getlistpart(listpart, index, index)
}
}
功能
getlistpart
是一个函数,它返回一个列表,该列表由给定索引之间原始列表中的元素组成。