【左神算法】基础班第一课(一)——对数机和有序数组中找一个无序数组元素

it2022-05-05  101

问题:在找出长度为m的无序数组b不存在于长度为n的有序数组a中的元素。

a = [1, 2, 3, 4, 5]   

b= [1, 9, 3, 7, 5]

输出 [9, 7]

方法一:穷举 m*n

方法二:在a中二分查找,m*logn

方法三:b排序, 求差集 m*longm

具体用方法二还是方法三,看数组长度。

同时介绍对数器:

在笔试中有一个保证正确且容易实现的方法right functin,但是复杂度很高,那么实现它;

同时实现一个样例生成器、实现优化算法f和结果比较算法

同时运行right functin和f,用样例生成器生成大样本,验证优化算法正确性。

具体代码如下

二分查找可以直接  bool binary_serch(a.begin(), b.end(), key);

#include <iostream> #include <cstdio> #include <cstdlib> #include <vector> #include <algorithm> using namespace std; //生成器 void g(vector<int> &v, int size) { int n = rand() % size + 1; for (int i = 0; i < n; i++) { v.push_back(rand() % 100000007); } } //保证正确,且容易实现的方法 vector<int> rightfunc(vector<int> a, vector<int> b) { vector<int> res; for (int i = 0; i < b.size(); i++) { if (find(a.begin(), a.end(), b[i]) == a.end()) { res.push_back(b[i]); } } return res; } int bin_search(vector<int> a, int l, int r, int key) { if (l <= r) { int mid = (l + r) / 2; if (a[mid] == key) { return mid; } else if (a[mid] > key) { return bin_search(a, l, mid - 1, key); } else { return bin_search(a, mid + 1, r, key); } } return -1; } //方法2 vector<int> f(vector<int> a, vector<int> b) { vector<int> res; for (int i = 0; i < b.size(); i++) { if (bin_search(a, 0, (int)a.size() - 1, b[i]) == -1) { res.push_back(b[i]); } } return res; } void test() { int N = 50; while(N--) { vector<int> a, b; g(a, 100000); g(b, 1000); sort(a.begin(), a.end()); vector<int> res1 = rightfunc(a, b); vector<int> res2 = f(a, b); if (res1 == res2) { cout << N << endl; } else { cout << "error" << endl; } } cout << "OK" << endl; } //方法三 vector<int> f1(vector<int> a, vector<int> b) { sort(b.begin(), b.end()); vector<int> res; int posa = 0, posb = 0; while (posa < a.size() && posb < b.size()) { if (a[posa] < b[posb]) { ++posa; } else if (a[posa] > b[posb]) { ++posb; } else { ++posa; ++posb; } } while (posb < b.size()) { res.push_back(b[posb++]); } return res; } int main() { // test(); vector<int> a, b, res; int N, M, x; cin >> N >> M; for (int i = 0; i < N; i++) { cin >> x; a.push_back(x); } for (int i = 0; i < M; i++) { cin >> x; b.push_back(x); } res = f1(a, b); for (int i = 0; i < res.size(); i++) { cout << res[i] << ' '; } putchar(10); return 0; }

 


最新回复(0)