双指针算法案例:有序顺序表的交并差
当我们需要遍历并比较两个集合中的元素时,如果用一般的双循环算法那么时间复杂度就来到了O(n^2),但是以下案例中的双指针算法就解决了时间复杂度的问题 让时间复杂度降低到了O(n);
#include <iostream>
using namespace std;class myList
{
private:int* num;int size;int pos;
public:myList(){pos = 0;this->num = NULL;this->size = 0;}myList(int size){pos = 0;this->size = size;num = new int[size];}//定义拷贝构造函数防止在使用重载运算符时接收返回值时出现浅拷贝问题myList(const myList& lst){this->num = new int[lst.size];this->pos = 0;this->size = lst.size;for (int i = 0; i < size; i++){*(this->num + i) = *(lst.num + i);}}void push_back(int n){if (pos == 0){*num = n;pos++;}else if (pos == size){cout << "空间不足" << endl;exit(0);}else{if (n < *(num + pos - 1)){cout << "插入数据不合法" << endl;exit(0);}else{*(num + pos) = n;pos++;}}}void pop_back(){if (size != 0){size--;}else{cout << "操作不合法" << endl;exit(0);}}void show_list(){for (int i = 0; i < size; i++){cout << *(num + i) << " ";}}~myList(){delete[] num;num = NULL;}//重新开辟空间 避免浅拷贝输出随机值myList& operator=(const myList& lst){delete[] num;this->size = lst.size;this->pos = lst.pos;num = new int[size];for (int i = 0; i < size; i++){*(num + i) = *(lst.num + i);}return *this;}//求差集 双指针算法降低了时间复杂度myList operator-(const myList& lst){myList temp(this->size);//重新规定大小避免了后续拷贝接收的时候开辟多余的空间temp.size = 0;int i = 0;int j = 0;while (i < this->size && j < lst.size){if (*(this->num + i) == *(lst.num + j)){i++;j++;}else if (*(this->num + i) < *(lst.num + j)){temp.size++;temp.push_back(*(this->num + i));i++;}else{j++;}}if (i < this->size){while (i < this->size){temp.size++;temp.push_back(*(this->num + i));i++;}}return temp;}//求并集myList operator+(const myList& lst){myList temp(this->size + lst.size);temp.size = 0;int i = 0;int j = 0;while (i < this->size && j < lst.size){if (*(num + i) == *(lst.num + j)){temp.size++;temp.push_back(*(num + i));i++;j++;}else{temp.size++;if (*(num + i) > *(lst.num + j)){temp.push_back(*(lst.num + j));j++;}else{temp.push_back(*(num + i));i++;}}}while(i < this->size){temp.size++;temp.push_back(*(num + i));i++;}while (j < lst.size){temp.size++;temp.push_back(*(lst.num + j));j++;}return temp;}//求交集myList operator&(const myList& lst){myList temp(this->size + lst.size);temp.size = 0;int i = 0;int j = 0;while (i < this->size && j < lst.size){if (*(num + i) == *(lst.num + j)){temp.size++;temp.push_back(*(num + i));i++;j++;}else if (*(num + i) < *(lst.num + j)){i++;}else{j++;}}return temp;}
};//测试案例
void tset01()
{myList lst1(5);lst1.push_back(1);lst1.push_back(2);lst1.push_back(3);lst1.push_back(4);lst1.push_back(5);myList lst2(3);lst2.push_back(2);lst2.push_back(3);lst2.push_back(6);lst1.show_list();cout << endl;lst2.show_list();cout << endl;//求差集myList a;a = lst1 - lst2;a.show_list();cout << endl;//求并集myList b;b = lst1 + lst2;b.show_list();cout << endl;//求交集myList c;c = lst1 & lst2;c.show_list();
}int main()
{tset01();return 0;
}