当前位置: 首页 > news >正文

双指针算法案例:有序顺序表的交并差

当我们需要遍历并比较两个集合中的元素时,如果用一般的双循环算法那么时间复杂度就来到了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;
}
http://www.dtcms.com/a/393404.html

相关文章:

  • syn和quote实现派生宏Builder
  • MQTT消息质量等级——QoS
  • 【OpenGL】shader 着色器
  • 给AI装上“眼睛”:Schema标记和技术性GEO实战部署
  • 中超-克雷桑破门 齐鲁德比泰山2-2遭海牛读秒绝平!
  • gitflow在公司的全流程
  • 如何解决 pip install 安装报错 ModuleNotFoundError: No module named ‘grpc’ 问题
  • C语言第17讲
  • 人机协同开发中的“深水炸弹”——指令上下文混淆
  • 朴素贝叶斯算法详解:原理、应用与实践
  • 强化学习的数学原理-02章 贝尔曼公式
  • C++:入门基础(2)
  • 数据架构章节考试考点及关系梳理
  • 用TRAE编程助手编写一个浏览器插件
  • 赋能工业未来:向成电子XC3576H工控主板多领域应用前景
  • Multi-Agent多智能体系统(三)
  • 【语法进阶】高级用法、贪婪与非贪婪
  • 15天见效的SEO优化方案
  • C语言基础【20】:指针7
  • IC 数字逻辑设计中的硬件算法 01 记
  • 《棒球运动联盟》国家级运动健将标准·棒球1号位
  • AAC 详解
  • 蚂蚁集团DIVER登顶BRIGHT榜首,开源多阶段推理检索范式
  • 2013/12 JLPT听力原文 问题四
  • 挑战与应对:轻量化 AI 算法的成长烦恼
  • FPGA基础 -- CDC(Clock Domain Crossing)实战教程
  • 低碳经济:碳汇——从生态固碳到金融资产的价值转化
  • QGC 通信模块架构梳理
  • Application接口拓展功能(三)
  • 【Python】错误和异常