C++ “是二进制搜索”;交换的;?

C++ “是二进制搜索”;交换的;?,c++,algorithm,binary-search,C++,Algorithm,Binary Search,背景 我有两个仪器,分别叫1和2,它们接收附近第三个发射机发出的信号。此发射器有一个已知周期,T。这些仪器产生时间序列,其中每个时间戳是检测到信号时根据仪器时钟的当前时间 我知道仪表3中的时钟相对于仪表1有一些缓慢的漂移,这导致了时间偏移。我的目标是确定这个漂移的大小 我编写了下面的代码来实现这一点。我所做的就是遍历一个站点生成的时间戳,并搜索剩余站点生成的最近的时间戳。由于脉冲发生器周期为秒级,且偏移量最多为几分之一秒,因此应提供正确的“匹配”。我编写了一个非常简单的二进制搜索函数(searc

背景

我有两个仪器,分别叫
1
2
,它们接收附近第三个发射机发出的信号。此发射器有一个已知周期,
T
。这些仪器产生时间序列,其中每个时间戳是检测到信号时根据仪器时钟的当前时间

我知道仪表
3
中的时钟相对于仪表
1
有一些缓慢的漂移,这导致了时间偏移。我的目标是确定这个漂移的大小

我编写了下面的代码来实现这一点。我所做的就是遍历一个站点生成的时间戳,并搜索剩余站点生成的最近的时间戳。由于脉冲发生器周期为秒级,且偏移量最多为几分之一秒,因此应提供正确的“匹配”。我编写了一个非常简单的二进制搜索函数(
search()
)来查找最接近的匹配项

奇怪的是,通过迭代instrument
1
的时间戳和搜索instrument
2
得到的偏移量与反向偏移量不同(分别是循环1和循环2)。如果我在向量
a
中搜索与
B
中某个值最接近的匹配项,那么在
B
中搜索与该匹配项最接近的匹配项不应该给出原始值吗

我很可能犯了一些愚蠢的错误,但尽管我尽了最大的努力,我还是无法确定我做错了什么

我的代码

double search(std::vector<double> &vec, double value){
    
    auto it = lower_bound(vec.begin(), vec.end(), value);
    if(it == vec.end()) return vec.back();

    auto found = *it;

    if(it != vec.begin()){

        if(std::abs(value - *(--it)) <  std::abs(value - found)){
            found = *(--it);
        }

    }

    return found;

}

int main(){

    /*****GET DATA*****/
    ROOT::RDataFrame data1("/path/to/file");
    ROOT::RDataFrame data2("/path/to/file");

    auto timestamps1 = *(data1.Take<double>("timestamps"));
    auto timestamps2 = *(data2.Take<double>("timestamps"));

    TH1 *histo1 = new TH1D("histo","histo1",1000,-5,5);
    TH1 *histo2 = new TH1D("histo","histo2",1000,-5,5);

    /*****PERFORM SEARCH*****/
    for(auto& t: timestamps1){ // LOOP # 1
 
        histo1->Fill(search(timestamps2, t) - t); 

    }

    for(auto& t: timestamps2){ // LOOP # 2
 
        histo2->Fill(search(timestamps1, t) - t); 

    }

    /*****DRAW HISTOGRAMS*****/
    histo1->Draw();
    histo2->Draw();

}
双搜索(标准::向量和向量,双值){
自动it=下限(vec.begin(),vec.end(),value);
if(it==vec.end())返回vec.back();
自动找到=*它;
如果(it!=vec.begin()){
如果(标准::abs(值-*(-it))<标准::abs(值-找到)){
发现=*(-it);
}
}
发现退货;
}
int main(){
/*****获取数据*****/
根::RDataFrame data1(“/path/to/file”);
根::RDataFrame data2(“/path/to/file”);
自动时间戳1=*(data1.Take(“时间戳”);
自动时间戳2=*(data2.Take(“时间戳”);
TH1*histo1=新的TH1D(“histo”,“histo1”,1000,-5,5);
TH1*histo2=新的TH1D(“histo”,“histo2”,1000,-5,5);
/*****执行搜索*****/
对于(auto&t:timestams1){//LOOP#1
历史1->填充(搜索(时间戳2,t)-t);
}
对于(auto&t:timestams2){//LOOP#2
历史2->填充(搜索(时间戳1,t)-t);
}
/*****绘制直方图*****/
histo1->Draw();
histo2->Draw();
}
如果我在向量a中搜索与B中某个值最近的匹配,那么在B中搜索与该匹配最近的匹配不应该给出原始值吗

不一定

考虑以下两个向量:

A: 0 3 8 9 10
B: 2 5 6 9 11
然后,如果我搜索一个最接近(比如)5的匹配项,我得到3

如果我在B中搜索与3最接近的匹配项,则得到2

因此,如果您依赖于此,则必须寻找替代解决方案

如果我在向量a中搜索与B中某个值最近的匹配,那么在B中搜索与该匹配最近的匹配不应该给出原始值吗

不一定

考虑以下两个向量:

A: 0 3 8 9 10
B: 2 5 6 9 11
然后,如果我搜索一个最接近(比如)5的匹配项,我得到3

如果我在B中搜索与3最接近的匹配项,则得到2


因此,如果您依赖于此,您将不得不寻找替代解决方案。

搜索
可以将它减量两次,这似乎是无意的。另外,这两个搜索循环在您迭代时搜索同一时间戳数组中的值。@1201程序谢谢您的输入。不幸的是,我不知道
search
如何将
it
减量两次。你能详细说明一下吗?在
if(std::abs(value-*(-it))
语句中,它被递减一次。然后if(
found=*(-it);
的主体第二次递减
it
。因此
found
的值将与比较中使用的值不同,并且您可能会取消引用无效迭代器。
search
可以递减
it
两次,这似乎是无意的。另外,两个搜索循环在执行itera时在同一时间戳数组中搜索值结束。@1201程序谢谢你的输入。不幸的是,我看不出
搜索
如何将
它减量两次。你能详细说明一下吗?在
if(std::abs(value-*-it))
语句中,它减量一次。然后if(
find=*-it)
)第二次递减
it
。因此
found
的值将与比较中使用的值不同,并且您可能会取消引用无效迭代器。