簡體   English   中英

雙二進制搜索算法

[英]Double binary search algorithm

我目前正在為我的研究項目處理雙重二進制搜索問題( 該算法可以在第49頁上找到 )。 代碼的每個if / else部分本身都可以正常工作,但是當我嘗試將它們放在一起時,整個代碼將導致無限循環。

代碼的交互式鏈接在這里 ,如果您想看一下 ,我已經使用printf進行了調試

#include <iostream>
#include <stdlib.h>
#include <set>
#include <vector>
#include <map>
#include <unordered_map>
#include <math.h>
using namespace std;

int binary_search(vector<int>& pos, int start, int end, int num, int& found)
{
    if (start > end) {
        //eventually will return position that the number is supposed to be in if not found
        return start;
    } else {
        int mid = start + (end - start)/2;

        if (pos[mid] == num) {
            found = 1;
            return mid;
        }
        if (pos[mid] < num) {
            return binary_search(pos, mid + 1, end, num, found);
        }
        else {
            return binary_search(pos, start, mid - 1, num, found);
        }
    }
}

vector<int> double_binary_search(vector<int>& vec_2, vector<int>& vec_1, int start_vec_2, int end_vec_2, int start_vec_1, int end_vec_1) 
{

    vector<int> intersection;
    if (end_vec_2 < start_vec_2 or end_vec_1 < start_vec_1) {
        return {};
    }

    int mid_vec_1 = start_vec_1 + (end_vec_1 - start_vec_1)/2;
    int mid_vec_1_val = vec_1[mid_vec_1];
    int found = 0;

    int mid_vec_2 = binary_search (vec_2, start_vec_2, end_vec_2, mid_vec_1_val, found);

    vector<int> res;
    //size of left 2 > size of left 1
    if ((mid_vec_2 - start_vec_2) > (mid_vec_1 - start_vec_1)) {
        res = double_binary_search(vec_2, vec_1, start_vec_2, mid_vec_2, start_vec_1, mid_vec_1);
        intersection.insert(intersection.end(), res.begin(), res.end());
    }

    else if ((mid_vec_2 - start_vec_2) <= (mid_vec_1 - start_vec_1)){// we exchange the roles of big vec and small vec
        res = double_binary_search(vec_1, vec_2, start_vec_1, mid_vec_1, start_vec_2, mid_vec_2);
        intersection.insert(intersection.end(), res.begin(), res.end());
    }   

    if (found == 1) {
        mid_vec_2++;
    }

    if ((end_vec_2 - mid_vec_2) > (end_vec_1 - mid_vec_1)) {
        res = double_binary_search(vec_2, vec_1, mid_vec_2, end_vec_2, mid_vec_1 + 1, end_vec_1);
        intersection.insert(intersection.end(), res.begin(), res.end());
    }

    else {// we exchange the roles of big vec and small vec
        vector<int> res = double_binary_search(vec_1, vec_2, mid_vec_1, end_vec_1, mid_vec_2 + 1, end_vec_2);
        intersection.insert(intersection.end(), res.begin(), res.end());
    }

    return intersection;

}

int main() 
{
    vector<int> vec_2 = {0,1,2,3,4,5,9,10,11,12,13,14,15,20,21,22,23,24,25};
    vector<int> vec_1 = {0,5,6,7,8,9,10,15,16,17,18};
    vector<int> sample = {11};
    vector<int> intersection = double_binary_search(vec_2, vec_1, 0, vec_2.size() - 1, 0, vec_1.size() - 1);  

    return 0;
}

如果start_vec_1 == end_vec_1start_vec_2 == end_vec_2double_binary_search以相同的參數遞歸調用double_binary_search (盡管交換vec1和vec2),因為else if條件將為true。 這將繼續進行,直到堆棧空間用完為止。

您需要調整該條件,以便您不必一直遞歸,和/或調整傳遞給遞歸調用的值(限制)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM