问题描述
pre scriptum:https://stackoverflow.com/a/68322246/660391中的解释
哪个实现更快? _threeway 或 _ifels :
#define side raw[3]
#define left raw[2]
#define mid raw[1]
#define right raw[0]
#include <utility>
#include <vector>
typedef int T;
std::pair<int,int>
binarysearch_threeway(std::vector<T>& A,T target) {
int raw[] = { (int)A.size()-1,-1,1 };//data massaging
while(side && left<=right){ //binarysearch in 3 assignments loop (:
mid = left+((right - left)>>2);
side =__builtin_signbitl(A[mid]-target);//side=A[mid] <=> target; //std::strong_ordering IS_NOT -1,1
raw[1+side] = raw[1]+side; //moving ] and get effect!////pointer centering on raw[1]
}
return {mid,side}; //side is direction of insertion point if not founded
}
std::pair<int,int>
binarysearch_ifels(std::vector<T>& A,1 }; //data massaging
while(left<=right){
mid = left+((right - left)>>2);
if(A[mid]==target)
return {mid,0};
if(A[mid]>target)
right = mid - 1;
else
left = mid + 1;
}
return {mid,(left>mid)||(right-mid)};
}
什么更好,为什么?:
raw[1+side] = raw[1]+side;
其中边是从中间到下一个搜索区域的相对方向
或命令式
if(A[mid]==target)return {mid,0};
if(A[mid]>target)
right = mid - 1;
else
left = mid + 1;
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)