04 2023 档案

摘要:关于map和set的实现先看库里面是怎样的. 库里面的map和set的底层都是一个叫做_Tree的封装类来完成的.下图中可以看到,map和set中的迭代器也基本上用的是_tree里面实现的迭代器. 这与之前学的栈与队列很像,栈与队列是将一个线性容器封装起来,通过调用线性容器自身的函数,实现栈和队列的 阅读全文

posted @ 2023-04-27 15:46 玄灵镜 阅读(40) 评论(0) 推荐(0) 编辑 |

摘要:继搜索二叉树和AVL树后有了红黑树。 AVL树改善了搜索二叉树在极端情况下的严重效率退化,但是在运用得过程中发现他对平衡的要求几乎达到了苛刻的地步,往往经过一系列复杂的变化只是将树的深度优化了一点点,而这一点点在现在日益快速的处理器下根本不起眼,于是有了更优的结构红黑树: 红黑树有以下几条规则: 1 阅读全文

posted @ 2023-04-25 22:39 玄灵镜 阅读(14) 评论(0) 推荐(0) 编辑 |

摘要:在计算机的使用中查找是个很重要的算法,但是一般的简单查找算法效率都不高,其中比较显著的方法是二分查找,但是二分查找的局限性很大,他只能在有序的数组中进行查找,所以想要用二分查找就必须先要对查找的数据进行排序,但是排序的时间复杂度又是一个问题。所以就提出了用树形的储存方式去存放数据排序和查找。 二叉搜 阅读全文

posted @ 2023-04-23 23:29 玄灵镜 阅读(31) 评论(0) 推荐(0) 编辑 |

摘要:快速排序相比其他极大排序在效率和空间复杂度上都算是比较优得。并且在进行了三数取中优化以后,除了及其小的情况外,基本能保持logn的时间复杂度。 三数取中法;在一堆数据中随机取三个数,然后取其中间大小的数。 有了三数取中的基础以后,快速排序的key就可以用三数取中来完成了。 1:快速排序有三种常用的方 阅读全文

posted @ 2023-04-20 22:45 玄灵镜 阅读(558) 评论(0) 推荐(0) 编辑 |

摘要:冒泡排序是相邻两个数不断比较在升序中将大的数不断移向后面。 首先要有数组的大小和需要排序的数组。 1:可以先将数组的最后一位设为end,while循环中不断对end自减,当end为零时表示数组中已经没有要排序的了。 2:内循环中不断将较大的数移向后面,循环中不断自增的i应该小于end;且安排i的前一 阅读全文

posted @ 2023-04-20 15:12 玄灵镜 阅读(49) 评论(0) 推荐(0) 编辑 |

摘要:map的插入比较繁琐,但是用方括号运算符就可以直接插入。也可以用方括号查找键的位置并且用它的返回值来修改值。同样map也可以用迭代器来遍历。map头文件中还有一个multimap关键字,他与map不同点在于它可以存入键相同的键值对,以应对某些情况。 给定一个单词列表 words 和一个整数 k ,返 阅读全文

posted @ 2023-04-19 23:11 玄灵镜 阅读(19) 评论(0) 推荐(0) 编辑 |

摘要:之前学习过string,list,vector,deque,和两种适配器queue和stack,这些都是线性表的数据结构;而今天学习的map和set他们的底层是二叉搜索树,或者平衡二叉搜索树。 首先是set她没有键值对,并且不能出现重复元素,比如当插入两个一时,他只会插入一个一,所以可以用作数组去重 阅读全文

posted @ 2023-04-18 23:12 玄灵镜 阅读(13) 评论(0) 推荐(0) 编辑 |

摘要:给你二叉树的根节点 root ,返回它节点值的 前序 遍历。 示例 1: 二叉树的前序中序和后序遍历算法是学习二叉树必不可少的,若是使用c语言遍历前中后序还是比较繁琐的,因为要考虑遍历结果存放的序列大小问题,想要解决这个问题就得想用递归计算二叉树的节点数量,再调用递归子函数完成递归遍历。 解题思路, 阅读全文

posted @ 2023-04-18 22:27 玄灵镜 阅读(15) 评论(0) 推荐(0) 编辑 |

摘要:给你二叉树的根节点 root ,返回其节点值 自底向上的层序遍历 。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)(出自力扣) 这个昨天的二叉树的层序遍历有所不同:需要将从后往前层序遍历二叉树,其实很简单,只需要用vector的逆置函数,将vector中的vector逆置即可。 这里顺 阅读全文

posted @ 2023-04-17 21:42 玄灵镜 阅读(10) 评论(0) 推荐(0) 编辑 |

摘要:给你二叉树的根节点 root ,请你采用前序遍历的方式,将二叉树转化为一个由括号和整数组成的字符串,返回构造出的字符串。 空节点使用一对空括号对 "()" 表示,转化后需要省略所有不影响字符串与原始二叉树之间的一对一映射关系的空括号对。 来源:力扣(LeetCode)链接:https://leetc 阅读全文

posted @ 2023-04-17 21:15 玄灵镜 阅读(15) 评论(0) 推荐(0) 编辑 |

摘要:二叉搜索树在二叉树的基础上加了一条规则,就是结点的左子树的值小于根节点,而节点右子树的值大于根节点,这样的结构的好处是当二叉搜索树的每个节点差小于等于一时搜索数据的时间复杂度与二分查找一样都是logn,他的作用价值还有一处就是它在中序遍历时会将所有的数据排序输出,同样对于一组乱序数据,若是普通的排序 阅读全文

posted @ 2023-04-16 22:52 玄灵镜 阅读(18) 评论(0) 推荐(0) 编辑 |

摘要:1.声明的虚函数若等于零则叫纯虚函数。他不能被不重写继承,且可以代表一些实例化对象抽象的概念。 2.对于虚函数接口继承的理解:普通函数是继承函数所有的东西,派生类就是为了调用这个函数而继承,而虚继承则是继承了这个函数的接口,函数的实现部分需要派生类去重写,从而达成多态。 3.虚函数在类里面以一个虚表 阅读全文

posted @ 2023-04-15 23:37 玄灵镜 阅读(12) 评论(0) 推荐(0) 编辑 |

摘要:所以说继承到派生类的基类成员初始化必须调用基类自己的构造函数,如果派生类无权调用基类的构造函数那么也就无法继承了。 还有要注意的是一个派生类无法继承基类的友元函数,就是说一个类以外的友元函数可以访问基类的私有变量但是无法访问继承基类的派生类的私有变量, 静态成员的继承:当一个派生类继承基类的静态变量 阅读全文

posted @ 2023-04-14 23:37 玄灵镜 阅读(14) 评论(0) 推荐(0) 编辑 |

摘要:之前在c语言写学生管理系统时操作对象只是学生,对学生进行增删查改,若是想要定义老师的结构题又有很大的工作量,但是其中成员变量又有很多重复的,C++的继承可以很好的解决这种问题,继承分为私有保护和公有继承,一般私有继承和保护继承很少用到,所以大多是公有继承派生类分别继承基类的共有在派生类中也是共有,继 阅读全文

posted @ 2023-04-13 23:29 玄灵镜 阅读(11) 评论(0) 推荐(0) 编辑 |

摘要:1.将树转化为二叉树:将树的所有兄弟节点链接,然后去掉每个节点的出第一个孩子外所有的孩子,整理得到一个二叉树.这样得到的是二叉树有一个特点就是每棵树的根节点只有一个孩子. 2.将森林转化为二叉树:将森林中所有的树都按照上述方法转化成二叉树,然后因为每个二叉树的根节点都只有一个孩子,可以将一颗二叉树的 阅读全文

posted @ 2023-04-13 22:15 玄灵镜 阅读(32) 评论(0) 推荐(0) 编辑 |

摘要:仿函数的学习:之前在实现优先级队列时在模板那里多传一个参数可以实现直接堆优先级的调整,因为设置大数优先还是小数优先,只是建大堆还是建小堆和相关算法的问题,而大堆算法与小堆算法的不同只是大于小于号的不同,若是仅仅因为这个就重新写一个相似的代码未免有点太冗余了,所以可以引入一个类这个类代替运算符的功能, 阅读全文

posted @ 2023-04-12 23:23 玄灵镜 阅读(31) 评论(0) 推荐(0) 编辑 |

摘要:线索二叉树与以往的二叉树略有不同,普通二叉树在访问到叶子结点的时候会返回,往往递归的效率并不高,有时还可能有栈溢出的风险,但是线索二叉树在访问到叶子结点的时候因为没有左右孩子,所以他左边存放他前驱的指针。右边存放后继的指针,是指从一个非线性结构变成了一个可以线性访问的的结构,特别是在中许下直接找到他 阅读全文

posted @ 2023-04-12 21:18 玄灵镜 阅读(22) 评论(0) 推荐(0) 编辑 |

摘要:栈与队列与之前的类都有所不同,他们类似于一个适配器,他们的实现时给一个给定的表加一定的限制或属性使其成为队列或者栈, 可以看到他们里面的成员变量就是一个容器,而插入和删除也都是对里面容器的尾删和插入等,但是要注意的是因为顺序表效率原因不支持头插,所以队列的容器也不能支持vector类。 在queue 阅读全文

posted @ 2023-04-11 23:26 玄灵镜 阅读(12) 评论(0) 推荐(0) 编辑 |

摘要:设计一个支持 push ,pop ,top 操作,并能在常数时间内检索到最小元素的栈。 实现 MinStack 类: MinStack() 初始化堆栈对象。void push(int val) 将元素val推入堆栈。void pop() 删除堆栈顶部的元素。int top() 获取堆栈顶部的元素。i 阅读全文

posted @ 2023-04-11 23:03 玄灵镜 阅读(13) 评论(0) 推荐(0) 编辑 |

摘要:无论是string还是vector或者list他们的迭代器都有类似于指针的行为,解引用时都能访问其中的数值。 2.list重载->运算符时比较奇怪, 就像这样子,迭代器返回一个日期类型的指针,所以it-->的返回值是data的指针,常理来说应该是it->->-day才对,所以这里应该是省略了一个-> 阅读全文

posted @ 2023-04-10 20:12 玄灵镜 阅读(11) 评论(0) 推荐(0) 编辑 |

摘要:首先list不同于string和vector他是链式结构,所以需要对他的每个节点自定义.并且每个节点要包含上或下节点的指针.因为struct在c++中升级成了类所以她也需要几大默认函数,但同时他也适用结构体.于是图片中对节点进行了声明和完成了构造函数. 完成了list节点的构造就要开始list类的成 阅读全文

posted @ 2023-04-09 22:37 玄灵镜 阅读(11) 评论(0) 推荐(0) 编辑 |

摘要:对vector的补充:之前写过vector,但是如果用string来初始化vector;一旦发生增容编译器就会浅拷贝string数据,当析构旧的数据是就会把新数据一起析构掉,所以在增容换地址时不要用么么memcpy,用for循环以一个一个去赋值就会解决这种问题; list相比vector的优缺点: 阅读全文

posted @ 2023-04-09 22:17 玄灵镜 阅读(12) 评论(0) 推荐(0) 编辑 |

摘要:vector类不同于string类.他其中的成员变量都为重定义自定义类型指针为迭代器,用指针的位置来代表容量,当前容器大小 构造函数:将所有指针都置为空,析构函数:释放空间并将所有成员指针置为空. 拷贝构造和重载=运算符:拷贝构造可以开空间并依次尾插被拷贝类的各个数值来达到构造的目的,而自定义运算符 阅读全文

posted @ 2023-04-08 18:25 玄灵镜 阅读(16) 评论(0) 推荐(0) 编辑 |

摘要:给定一个非负整数 numRows,生成「杨辉三角」的前 numRows 行。 在「杨辉三角」中,每个数是它左上方和右上方的数的和。 出处:leetcode 对于此题可以建立一个vector<vector<int>>,对外层开辟numRows行,对内层开辟从零开始每次加一个,并把头尾都置为一,然后根据 阅读全文

posted @ 2023-04-08 17:58 玄灵镜 阅读(9) 评论(0) 推荐(0) 编辑 |

摘要:给你一个整数数组 nums,其中恰好有两个元素只出现一次,其余所有元素均出现两次。 找出只出现一次的那两个元素。你可以按 任意顺序 返回答案。 你必须设计并实现线性时间复杂度的算法且仅使用常量额外空间来解决此问题。 来源:力扣(LeetCode)链接:https://leetcode.cn/prob 阅读全文

posted @ 2023-04-08 17:50 玄灵镜 阅读(15) 评论(1) 推荐(0) 编辑 |

摘要:给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法且不使用额外空间来解决此问题。 来源:力扣(LeetCode)链接:https://leetcode.cn/problems/singl 阅读全文

posted @ 2023-04-07 20:56 玄灵镜 阅读(13) 评论(0) 推荐(0) 编辑 |

摘要:给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。 来源:力扣(LeetCode)链接:https://leetcode.cn/problems/sin 阅读全文

posted @ 2023-04-07 17:52 玄灵镜 阅读(11) 评论(0) 推荐(0) 编辑 |

随笔 - 53, 文章 - 0, 评论 - 0, 阅读 - 1866

Copyright © 2025 玄灵镜
Powered by .NET 9.0 on Kubernetes

点击右上角即可分享
微信分享提示