- 博客(126)
- 收藏
- 关注
原创 C++ 哈希详解 (完整代码)
中,元素关键码与其存储位置之间没有对应的关系,因此在搜索的效率取决于搜索过程中元素的比较次数例如 :数据集合{1,7,6,4,5,9}哈希函数设置为:hash(key) = key % capacity;capacity为存储元素底层空间总的大小。用问题:按照上述哈希方式,向集合中插入元素44,会出现什么问题?
2025-03-16 01:17:19
630
原创 C++ unordered系列关联式容器
unordered_map的文档介绍1. unordered_map是存储键值对的关联式容器,其允许通过keys快速的索引到与 其对应的value。2. 在unordered_map中,键值通常用于惟一地标识元素,而映射值是一个对象,其内容与此 键关联。键和映射值的类型可能不同。3. 在内部,unordered_map没有对按照任何特定的顺序排序, 为了能在常数范围内 找到key所对应的value,unordered_map将相同哈希值的键值对放在相同的桶中。
2025-03-15 21:21:19
755
原创 C++ 红黑树(详解 完整代码)
C++ AVL树(详解 完整代码)-优快云博客// 这里也可以用struct// struct默认是公有的,class默认私有所以加上publicpublic:colour col;, _kv(kv), col(RED){}在节点的定义中,为什么要将节点的默认颜色给成红色的?因为插入一个红色结点 只影响当前路径,插入黑色这条路径的黑色节点数量变化,那么为了满足条件,别得路径也要修改,极其麻烦// 如果为空树,创建新节点即可。
2025-03-10 13:42:55
798
原创 C++ AVL树(详解 完整代码)
{}// 该节点的左孩子// 该节点的右孩子// 该节点的双亲T _data;int _bf;// 该节点的平衡因子。
2025-03-07 01:09:46
668
原创 C++ map和set(详解) 包括multiset和multimap(详解)
在前面,我们已经接触过STL中的部分容器,比如:vector、list、deque、forward_list(C++11)等,这些容器统称为序列式容器,因为其底层为线性序列的数据结构,里面存储的是元素本身。那什么是关联式容器?它与序列式容器有什么区别?关联式容器也是用来存储数据的,与序列式容器不同的是,其里面存储的是结构的键值对,在数据检索时比序列式容器效率更高set文档介绍翻译:1. set是按照一定次序存储元素的容器。
2025-03-05 20:59:48
600
原创 C++ 迭代器类型
单向迭代器(forward iterator)双向迭代器( bidirectional iterator )随机迭代器(random access iterator )
2025-03-04 16:39:16
142
原创 C++ 搜索二叉树(二叉搜索树) 详解
情况b:删除该结点且使被删除节点的双亲结点指向被删除节点的左孩子结点--直接删除 情况c:删除该结点且使被删除节点的双亲结点指向被删除结点的右孩子结点--直接删除 情况d:在它的右子树中寻找中序下的第一个结点(关键码最小),用它的值填补到被删除节点 中,再来处理该结点的删除问题--替换法删除。对有n个结点的二叉搜索树,若每个元素查找的概率相等,则二叉搜索树平均查找长度是结点在二 叉搜索树的深度的函数,即结点越深,则比较次数越多。10. 二叉树的后序遍历 ,非递归迭代实现。
2025-02-26 10:57:56
528
原创 C++ 多态详解
需要声明的:本文中的代码及解释都是在vs2013下的x86程序中,涉及的指针都是4bytes。如果要其他平台下,部分代码需要改动。比如:如果是x64程序,则需要考虑指针是8bytes问题等等多态是在不同继承关系的类对象,去调用同一函数,产生了不同的行为。比如Student继承了 Person。Person对象买票全价,Student对象买票半价。那么在继承中要构成多态还有两个条件1.必须通过基类的指针或者引用调用虚函数2.被调用的函数必须是虚函数,且派生类必须对基类的虚函数进行重写。
2025-02-19 17:14:36
1057
原创 C++ 继承详解
继承(inheritance)机制是面向对象程序设计使代码可以复用的最重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能,这样产生新的类,称派生类。继承呈现了面向对象程序设计的层次结构,体现了由简单到复杂的认知过程。以前我们接触的复用都是函数复用,继承是类设计层次的复用。public:protected:// 姓名// 年龄// 继承后父类的Person的成员(成员函数+成员变量)都会变成子类的一部分。这里体现出了// Student和Teacher复用了Person的成员。
2025-02-17 21:32:34
553
原创 C++ 模板详解
一个程序(项目)由若干个源文件共同实现,而每个源文件单独编译生成目标文件,最后将所有目标文件链 接起来形成单一的可执行文件的过程称为分离编译模式。
2025-02-11 20:51:08
672
原创 C++ 迭代器失效问题
底层实现vector、deque底层都是用了连续空间,所以虽然++iter迭代器了,但是erase(tempit)以后底层是连续空间,删除会挪动数据,最终导致iter意义变了,已失效了。而list,不是连续空间,删除以后tempIt虽然失效了,但是不影响iter。
2025-01-23 19:23:38
182
原创 C++ priority_queue(优先级队列)
priority_queue的介绍1. 优先队列是一种容器适配器,根据严格的弱排序标准,它的第一个元素总是它所包含的元素中最大的。2. 此上下文类似于堆,在堆中可以随时插入元素,并且只能检索最大堆元素(优先队列中位于顶部的元 素)。3. 优先队列被实现为容器适配器,容器适配器即将特定容器类封装作为其底层容器类,queue提供一组特 定的成员函数来访问其元素。元素从特定容器的“尾部”弹出,其称为优先队列的顶部。4. 底层容器可以是任何标准容器类模板,也可以是其他特定设计的容器类。
2025-01-22 20:46:53
386
原创 C++ 最小栈 - 力扣(LeetCode)
-> 返回 -3.minStack.getMin();--> 返回 -2.minStack.top();操作,并能在常数时间内检索到最小元素的栈。
2024-12-26 11:01:27
337
原创 C++ 栈的压入、弹出序列_牛客题霸(牛客网)
输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。例如序列1,2,3,4,5是某栈的压入顺序,序列4,5,3,2,1是该压栈序列对应的一个弹出序列,但4,3,5,1,2就不可能是该压栈序列的弹出序列。由于是[1,2,3,4,5]的压入顺序,[4,3,5,1,2]的弹出顺序,要求4,3,5必须在1,2前压入,且1,2不能弹出,但是这样压入的顺序,1又不能在2之前弹出,所以无法形成的,返回false。这样的顺序得到[4,5,3,2,1]这个序列,返回true。
2024-12-26 10:58:25
325
原创 C++ 逆波兰表达式求值 - 力扣(LeetCode)
该算式转化为常见的中缀算术表达式为:(4 + (13 / 5)) = 6。该算式转化为常见的中缀算术表达式为:((2 + 1) * 3) = 9。逆波兰表达式是一种后缀表达式,所谓后缀就是指算符写在后面。返回一个表示表达式值的整数。
2024-12-26 10:53:30
241
原创 C++ 用栈实现队列 - 力扣(LeetCode)
4. 获取队头元素时,若st2不空,就去栈顶元素即为队头,若为空,则需要把栈st1里面的所有数据导入st2。3. 出队时,若st2不空,直接出栈即是出队,若st2已为空,则把栈st1里面的所有数据导入st2。1. 不管底层用什么结构实现,永远保证数据先进先出的一个逻辑数据结构,即队列。请你仅使用两个栈实现先入先出队列。队列应当支持一般队列支持的所有操作(2. 创建栈st1和st2,入队直接在栈st1进行入队操作,5. 判断队列是否为空,需要满足两个栈都为空时整个队列才为空。
2024-12-26 10:51:27
378
原创 C++ 用队列实现栈 - 力扣(LeetCode)
请你仅使用两个队列实现一个后入先出(LIFO)的栈,并支持普通栈的全部四种操作(myStack.empty();// 返回 False。
2024-12-26 10:48:12
299
原创 C++ 数组中的第K个最大元素 - 力扣(LeetCode)
请注意,你需要找的是数组排序后的第。你必须设计并实现时间复杂度为。个最大的元素,而不是第。
2024-12-26 10:42:27
300
原创 C++ stack和queue(栈和队列)详解
stack文档介绍1. stack是一种容器适配器,专门用在具有后进先出操作的上下文环境中,其删除只能从容器的一端进行 元素的插入与提取操作。2. stack是作为容器适配器被实现的,容器适配器即是对特定类封装作为其底层的容器,并提供一组特定 的成员函数来访问其元素,将特定类作为其底层的,元素特定容器的尾部(即栈顶)被压入和弹出。3. stack的底层容器可以是任何标准的容器类模板或者一些其他特定的容器类,这些容器类应该支持以下 操作:empty:判空操作back:获取尾部元素操作。
2024-12-26 10:36:04
788
原创 C++ List详解
1. list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。2. list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向 其前一个元素和后一个元素。3. list与forward_list非常相似:最主要的不同在于forward_list是单链表,只能朝前迭代,已让其更简单高效。4. 与其他的序列式容器相比(array,vector,deque),list通常在任意位置进行插入、移除元素的执行效率更好。
2024-12-24 09:44:52
1226
原创 C++ vector详解
vector的文档介绍1. vector是表示可变大小数组的序列容器。2. 就像数组一样,vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素 进行访问,和数组一样高效。但是又不像数组,它的大小是可以动态改变的,而且它的大小会被容器自 动处理。3. 本质讲,vector使用动态分配数组来存储它的元素。当新元素插入时候,这个数组需要被重新分配大小为了增加存储空间。其做法是,分配一个新的数组,然后将全部元素移到这个数组。
2024-12-21 22:21:38
1074
原创 C++ 数组中出现次数超过一半的数字(牛客网)
数组中有一个数字出现的次数超过数组长度的一半,也就是说数组的数字总数为奇数,如果两个数不相等就可以抵消掉,最后剩下的那个数就是答案。例如输入一个长度为9的数组[1,2,3,2,2,2,5,4,2]。数据范围:n≤50000n≤50000,数组中元素的值 0≤val≤100000≤val≤10000。给一个长度为 n 的数组,数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。要求:空间复杂度:O(1)O(1),时间复杂度 O(n)O(n)保证数组输入非空,且保证有解。
2024-12-20 10:55:53
351
原创 C++ 电话号码的字母组合 - 力扣(LeetCode)
给出数字到字母的映射如下(与电话按键相同)。注意 1 不对应任何字母。的字符串,返回所有它能表示的字母组合。
2024-12-20 09:55:48
265
原创 C++ 只出现一次的数字 III - 力扣(LeetCode)
其中恰好有两个元素只出现一次,其余所有元素均出现两次。找出只出现一次的那两个元素。你必须设计并实现线性时间复杂度的算法且仅使用常量额外空间来解决此问题。[5, 3] 也是有效的答案。
2024-12-19 22:42:40
397
原创 C++ 只出现一次的数字 II - 力扣(LeetCode)
具体地,考虑答案的第 i 个二进制位(i 从 0 开始编号),它可能为 0 或 1。对于数组中非答案的元素,每一个元素都出现了 3 次,对应着第 i 个二进制位的 3 个 0 或 3 个 1,无论是哪一种情况,它们的和都是 3 的倍数(即和为 0 或 3)。由于数组中的元素都在 int(即 32 位整数)范围内,因此我们可以依次计算答案的每一个二进制位是 0 还是 1。因此:答案的第 i 个二进制位就是数组中所有元素的第 i 个二进制位之和除以 3 的余数。请你找出并返回那个只出现了一次的元素。
2024-12-19 22:32:20
296
原创 C++ 删除有序数组中的重复项 - 力扣(LeetCode)
/ 长度正确的期望答案。如果所有断言都通过,那么您的题解将被。,返回删除后数组的新长度。删除重复出现的元素,使每个元素。
2024-12-19 22:22:19
246
wu-et-al-2021-non-line-of-sight-imaging-over-1-43-km(!!免费!!)
2024-08-12
中国科学院大学(国科大UCAS)-机器学习方法与应用(机器学习)-叶齐祥老师-上机练习作业
2024-07-23
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人