如何解决是 raw[1+side]... 比 eq 快然后比较少?
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 举报,一经查实,本站将立刻删除。