雜湊 3 判斷乙個陣列是否為另乙個陣列的子集

2021-07-03 04:03:21 字數 3908 閱讀 2247

目錄

1.簡單方法

2.使用排序和二分搜尋

3.使用排序和歸併

4.使用雜湊

給定兩個陣列:arr1[0..m-1]和arr2[0..n-1],判斷arr2是否為arr1的子集。這兩個陣列都是無序的。

例如:輸入: arr1 = , arr2 =

輸出: arr2是arr1的子集。

輸入: arr1 = , arr2 =

輸出: arr2是arr1的子集。

輸入: arr1 = , arr2 =

輸出: arr2不是arr1的子集,因為arr2中的元素3,不存在於arr1中。

使用兩個迴圈來處理:外層的迴圈遍歷arr2的每個元素。內層的迴圈逐個的取元素與外層傳入的元素進行比較。如果所有元素都匹配成功,則返回1,否則返回0。

#include//如果arr2是arr1的子集,則返回1.

bool issubset(int arr1, int arr2, int numarr1, int numarr2)

//如果上面的內層迴圈沒有break, 則說明arr2不是arr1的子集

if (j == numarr1)

return 0;

}//如果執行到這裡,說明arr2是arr1的子集

return 1;

}int main() ;

int arr2 = ;

int numarr1 = sizeof(arr1) / sizeof(arr1[0]);

int numarr2 = sizeof(arr2) / sizeof(arr2[0]);

if (issubset(arr1, arr2, numarr1, numarr2))

std::cout << "arr2 is subset of arr1";

else

std::cout << "arr2 is not a subset of arr1";

return 0;

}

執行結果:

arr2 is subset of arr1

時間複雜度: o(m*n)

1) 對arr1進行排序, 平均o(mlogm)

2) 對arr2中的每個元素,在已排序的arr1中進行二分查詢。

a) 如果沒有找到這個元素,則返回0。

3) 如果所有元素都找到,則返回1。

#include //函式宣告 。兩個輔助函式,用於判斷子集。

void quicksort(int* arr, int si, int ei);

int binarysearch(int arr, int low, int high, int x);

// 如果arr2是arr1的乙個子集,則返回1

bool issubset(int arr1, int arr2, int numarr1, int numarr2)

//如果執行到了這裡,說明arr2是arr1的子集

return 1;

}//---------輔助函式begin--------

//標準的二分查詢函式

int binarysearch(int arr, int low, int high, int x)

return -1;

}templatevoid exchange(type* a, type* b)

int partition(int a, int si, int ei)

}exchange(&a[i + 1], &a[ei]);

return (i + 1);}/*

實現快速排序的函式

a:需要排序的陣列

si:starting index

ei:ending index

*/void quicksort(int a, int si, int ei)

}//---------輔助函式end--------

int main() ;

int arr2 = ;

int numarr1 = sizeof(arr1) / sizeof(arr1[0]);

int numarr2 = sizeof(arr2) / sizeof(arr2[0]);

if (issubset(arr1, arr2, numarr1, numarr2))

std::cout << "arr2 is subset of arr1";

else

std::cout << "arr2 is not a subset of arr1";

return 0;

}

執行結果:

arr2 is subset of arr1

時間複雜度: o(mlogm + nlogm)。其中,mlogm是排序演算法的平均複雜度。因為上面用的是快速排序,如果是最壞情況,則複雜度會變為o(m^2)。

1) 對兩個陣列arr1和arr2分別排序。o(mlogm + nlogn)

2) 使用歸併流程來檢測已排好序的陣列arr2是否存在於排好序的arr1中。參考issubset函式實現。

#include //函式宣告 。兩個輔助函式,用於判斷子集。

void quicksort(int* arr, int si, int ei);

//如果arr2是arr1的子集,則返回1

bool issubset(int arr1, int arr2, int m, int n)

else if (arr1[j] > arr2[i])

return 0;

}if (i < n)

return 0;

else

return 1;

}//---------輔助函式begin--------

//標準的二分查詢函式

int binarysearch(int arr, int low, int high, int x)

return -1;

}templatevoid exchange(type* a, type* b)

int partition(int a, int si, int ei)

}exchange(&a[i + 1], &a[ei]);

return (i + 1);}/*

實現快速排序的函式

a:需要排序的陣列

si:starting index

ei:ending index

*/void quicksort(int a, int si, int ei)

}//---------輔助函式end--------

int main() ;

int arr2 = ;

int numarr1 = sizeof(arr1) / sizeof(arr1[0]);

int numarr2 = sizeof(arr2) / sizeof(arr2[0]);

if (issubset(arr1, arr2, numarr1, numarr2))

std::cout << "arr2 is subset of arr1";

else

std::cout << "arr2 is not a subset of arr1";

return 0;

}

執行結果:

arr2 is subset of arr1

時間複雜度: o(mlogm + nlogn) 。比方法2要好。

1) 給陣列arr1的所有元素建立乙個雜湊表。

2) 遍歷陣列arr2,並檢測其中的每個元素是否存在於雜湊表中。如果雜湊表中沒有找到元素,則返回0。

3) 如果所有元素都找到了,則返回1。

注意:方法1,2,4都沒有處理arr2陣列中有重複元素的情況。例如, 實際上不是 的子集,但上述的這些方法會認為是子集。

判斷乙個陣列是否包含另乙個陣列

function iscontainarr parent,child let parent 1,2,3,6,5,4 let child 1,3,4,6 let child2 1,3,4,6,7 console.log iscontainarr parent,child true console.lo...

判斷乙個陣列是否是另乙個陣列的子集

給兩個陣列 arr1 0.m 1 和arr2 0.n 1 判斷arr2是否是arr1的乙個子集合,兩個陣列都是未排序的。例子 input arr1 arr2 output arr2 is a subset of arr1 input arr1 arr2 output arr2 is a subset...

判斷乙個陣列是否為空陣列

最近在做乙個專案,遇到乙個需要判斷乙個陣列是否為空陣列的問題。一般的,當被測試的陣列是乙個一維陣列的時候,只要簡單的用 bool empty array 就能解決問題。當被測試的陣列為二維陣列時,empty函式返回的是true,這顯然不行。像下段 中,array 是個空陣列。array array ...