目錄
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 ...