1. 程式人生 > 實用技巧 >雙指標法求兩個有序集合交集與並集

雙指標法求兩個有序集合交集與並集

1.利用資料的有序性和指標的動態變化求元素交集.核心函式Search_Common通過每次迴圈比較兩個指標所指向資料的大小來遞進較小序列的指標,直至一個指標到達序列尾部.
2.核心函式Search_All通過每次迴圈的比較將較小值進行新增並遞進較小序列的指標,直至一個指標到達序列尾部,再將剩下的值都新增,防止遺漏.
程式碼如下:

1.求交集
#include <iostream>
#include <vector>

using namespace std;

//給定兩個升序陣列,利用雙指標法進行合取操作並存儲,演算法複雜度為O(N)
void Search_Common(int
*a, int &length_a, int *b, int &length_b, vector<int> &container); int main(void) { int b[7] = {1, 3, 4, 5, 8, 19, 20}; int a[10] = {0, 2, 4, 5, 6, 8, 19, 20,67,99}; int length_a = sizeof(a) / sizeof(int); int length_b = sizeof(b) / sizeof(int); vector<int> container; Search_Common(a, length_a, b, length_b, container);
for (long long unsigned int j = 0; j < container.size(); j++) cout << container[j] << endl; return 0; } void Search_Common(int *a, int &length_a, int *b, int &length_b, vector<int> &container) { int *pa = a; int *pb = b; while (pa < a + length_a && pb < b + length_b)//
結束條件為兩個指標有一個到達陣列末尾 if (*pa == *pb) { container.push_back(*pa); //相同的項則新增,同時兩指標前進一步 pa++; pb++; } //永遠讓較小的指標前進,直至結束 else if (*pa > *pb) pb++; else pa++; }


#include <iostream>
#include <vector>

using namespace std;

//給定兩個有序陣列,利用雙指標法進行析取操作並存儲,演算法複雜度為O(N)
void Search_All(int *a, int &length_a, int *b, int &length_b, vector<int> &container);

int main(void)
{
    int a[6] = {1, 3, 4, 19, 20,34};
    int b[7] = {0, 2, 4, 5, 18, 26, 29};
    int length_a = sizeof(a) / sizeof(int);
    int length_b = sizeof(b) / sizeof(int);
    vector<int> container;

    Search_All(a, length_a, b, length_b, container);

    for (long long unsigned int j = 0; j < container.size(); j++)
        cout << container[j] << endl;
    return 0;
}
2.求並集
void Search_All(int *a, int &length_a, int *b, int &length_b, vector<int> &container) { int i, j; i = j = 0; // 通過不斷比較來更新i,j的值,針對每種情況做出相應變化 while (i < length_a && j < length_b)//兩個指標有一個到達序列末尾時就跳出迴圈 { //不斷新增較小值,新增後遞進較小值序列的指標 if (a[i] > b[j]) { container.push_back(b[j]); j++; } else if (a[i] < b[j]) { container.push_back(a[i]); i++; } else//二者相等則新增其一,兩個指標都遞進 { container.push_back(a[i]); i++; j++; } } // 退出主迴圈後將剩餘項全部加入. while (i < length_a) { container.push_back(a[i]); i++; } while (j < length_b) { container.push_back(b[j]); j++; } }