问题:在找出长度为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; }