自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(20)
  • 收藏
  • 关注

原创 快速排序及两种优化与思考

三路快速排序是双路快速排序的进一步改进版本,三路快排将排序的数据分为三部分,分别小于v,等于v,大于v,v为标定值,在这样的三部分数据中,等于v的数据在下一次递归中不再需要排序,这样很好的降低了递归的深度,另一方面也减少了栈溢出的可能性,小于v和大于v的数据也不会出现哪一个特别多的情形,此方法可以让三路快速排序算法的性能更优。我们在一个数组中,选择一个基点,比如第一个位置的6,然后将6挪动到正确位置,让在这个基点之前的子数组中数据都小于6,之后的子数组中数据都大于6,然后逐渐递归下去完成整个排序。

2024-12-10 08:42:09 765

原创 C++ 智能指针

C++智能指针是现代C++中用于自动管理动态内存的重要工具,旨在避免内存泄漏和悬空指针等常见问题。智能指针通过封装原始指针,提供了自动化的内存管理。主要有三种类型:std::unique_ptr、std::shared_ptr 和 std::weak_ptr。智能指针的使用大大减少了手动管理内存的复杂性,提高了代码的安全性和可维护性,是现代C++编程中不可或缺的工具之一。

2024-11-23 11:49:05 993

原创 C++ 深拷贝和浅拷贝

浅拷贝适合那些不需要独立数据的情况,而深拷贝则用于需要保持对象独立性、避免资源共享冲突的场景。深拷贝一般会增加一定的性能开销,但可以避免浅拷贝带来的潜在问题,如悬挂指针或内存泄漏等。

2024-11-19 04:30:00 875

原创 C++ 类型转换

C++中四种类型转换(static_cast、dynamic_cast、const_cast、reinterpret_cast)的简要概述,涵盖了它们的基本使用场景、功能和可能导致的运行时错误。

2024-11-18 22:17:57 1125 1

原创 STL--map、set的使用和模拟实现

在 C++ STL 中,set 和 map 是两个非常常用的容器,它们基于红黑树(Red-Black Tree)实现,提供了高效的插入、查找和删除操作。这些操作的时间复杂度为 O(logn),保证了容器操作在大规模数据中的高效性。本文将深入探讨如何通过红黑树模拟实现这两个容器,分析它们的底层结构、关键操作和实现细节。

2024-11-13 10:56:30 708

原创 STL 迭代器iteratior 详解

介绍了C++中不同类型的迭代器的操作以及如何模拟实现一个自定义迭代器。通过理解STL中迭代器的工作原理,进一步帮助开发者掌握如何设计和使用迭代器以满足不同容器访问的需求。

2024-11-05 15:58:53 1020

原创 红黑树详解

默认插入的节点颜色都是红色,因为插入黑色节点会破坏根路径上的黑色节点总数,但即使如此,也会出现连续红色节点的情况。bro涂黑,x->p涂红,然后将兄弟节点绕着父节点左旋,最后重新设置bro指向,让bro = x->p->right,这样操作以后,bro就变成了黑色节点(满足红黑树性质,必定黑色),在调整结束之后,就可能变为下面三种情况,然后我们再视情况具体调整。作为红黑树节点,其基本属性有:节点的颜色、左子节点指针、右子节点指针、父节点指针、节点的值。通过对任意一条从根到叶子的着色方式的限制,红黑树确保。

2024-10-22 09:16:55 648

原创 Python数据容器

我们学习了python基础的语言知识,以及列表,元组,字典,集合等存储结构。今天我来对此类数据容器做一些总结。

2024-10-14 10:38:08 959

原创 C++虚函数_用于解决菱形继承的问题

在菱形继承结构中,存在基类被两个派生类继承,这两个派生类又共同派生出一个类的情况。如果没有虚函数机制,会导致数据冗余和二义性问题。虚函数结合虚继承来解决此问题,虚继承使得在派生类中只有一份基类数据的副本。当使用虚函数时,在类的虚函数表中正确地维护函数的入口地址。这样,在菱形继承体系下,通过基类指针或引用调用虚函数时,可以准确地根据对象的实际类型调用到正确的函数实现,避免因多重继承可能带来的函数调用混乱等问题。

2024-10-13 21:53:03 572

原创 二叉平衡树之AVL树

若向平衡二叉树中插入一个节点后破坏了平衡二叉树的平衡性,首先从根节点到该新插入节点的路径之逆向根节点方向找到第一个失去平衡的节点,然后以该失衡节点和它相邻的刚查找过的两个节点构成调整子树,使之成为新的平衡子树。故需进行两次旋转操作(先顺时针,后逆时针),即先将A结点的右孩子C的左子树的根结点D向右上旋转提升到C结点的位置,然后再把该D结点向左上旋转提升到A结点的位置。注意:对于AVL树的插入,因为它是要结合AVL树的旋转的,所以在本文中,AVL树的插入和AVL树的旋转合起来才是完整的插入过程。

2024-08-31 22:51:38 739

原创 哈夫曼树及哈夫曼编码

计算带权路径长度之前,我们必须给树的每一个节点赋予一个特殊的意义,一般我们会是数字,而这个数字就成为这个节点的权,带权路径长度就是路径长度×权。第二步,找到新数列中此时最小的两个节点5,6,而后5,6构成新的子树,将5,6的和11按照顺序放在数列中,将根节点11作为数列的一部分。第一步,首先选择权值最小的2,3,而后,构成第二排所示的5-2-3.然后将该子树的根节点5 按照顺序放入原本序列中。哈夫曼树又称最优二叉树,带权路权长度最短的二叉树,带权路径即叶节点的权值与其到根节点的路径长度的乘积。

2024-08-05 00:32:48 1086

原创 基于WinForm构建的多项式计算器

在这里,我们使用栈这一数据结构,利用其先进后出的特性,将读到的第一个符号压入符号栈,在读到下一个符号,与栈顶的符号的优先级进行比较,若优先级比栈顶的那个符号低,就将栈顶符号的连接的两个数字(数字存在数字栈中)进行运算,否则将当前符号压入符号栈。能够识别四则运算的优先级和括号 的计算器,难点在于如何在遇到乘号,除号或者是括号的时候暂时不计算前面的加法和减法,而先去计算优先级高的运算符。3.2.1判断优先级,若当前符号的优先级小于栈顶符号的优先级,则栈顶符号出栈,同时数栈中两个数字出栈;

2024-07-14 21:49:12 1002

原创 基于数学三角形对动态规划的展示

接下来,我们要对上面方法进行优化,如何去减少运行时间,我们很自然可以考虑到,如果将重复计算的次数削减,肯定就节省很多时间,那我们将每个位置算出来的值都保存,下次需要的时候就直接取用,就免去了重复计算,便可以将时间复杂度降低到O(n).分析问题的最优子结构性质:首先假设由问题的最优解导出的子问题的解不是最优的,然后再设法说明在这个假设下可构造出比原问题最优解更好的解,从而导致矛盾。递归算法求解问题时,每次产生的子问题并不总是新问题,有些子问题被反复计算多次,这种性质称为子问题的重叠性质。

2024-07-12 14:58:29 573

原创 猜拳游戏python详解

以上就是一轮游戏的全部,在一轮游戏结束后,我们要对玩家进行一次访问,是否继续,然后使用条件语句(这为bool类型的判断)来进行操作,特别的说明如果需要退出,就使用break终止语句来跳出整个循环,达到结束游戏的功能,并给出游戏的结束画面输出。首先,要进行游戏的进行,我们要有游戏双方,即玩家和我们的对手,因此使用两个类分别封装两边的功能,在进行双方都出拳了以后,我们需要一个方法(或者说叫函数)来进行判断输赢,因此我们再增加一个裁判类,用以判断游戏的输赢。类是对象的模板,对象则是类的实。这确保了程序的健壮性。

2024-06-03 19:03:35 755

原创 使用new创建动态数组

请注意将p3 加1的效果。因此我们一般选择使用new来创建数组,在运行阶段需要数组,我们则创建它,不需要时,就不创建。我们将指针看作一个指向该元素(数组第一个元素)的手指,int占4个字节,则将手指沿着正确的方向移动4个字节,而后指向第2个元素.....最后指向到第十个元素,这就是手指的移动范围,new语句中提供了识别内存块的每个元素所需要的全部信息。psome是一个指向int(数组第一个元素)的指针,由于编译器不能对psome指向10个整数中的第1个这种情况进行处理,因此,我们应该让程序跟踪元素的数目。

2024-05-29 22:35:05 1341

原创 二分查找(图解与完整代码实现)

中查找某一特定元素的搜索算法,思想为,不断将有序查找表“一分为二”,减少搜索区域,以至找到目标元素。注意:递归查找,每次递归,需要缩小范围,每次左右边界的值都在改变,所以需要将左右边界传入,定义为。二分查找图解:以有序数组{4, 9,12,23,30,76, 88,99}为,需要查找30.(low+high)/2 == mid,因此中间元素就是30,该元素就是要找的目标元素。第一轮:23<30,判定在30在23的右边区域,更新搜索区域。中间位置小于目标元素,更新左边界,再次查找。否则更新右边界,再次查找。

2024-04-14 20:02:26 1693 1

原创 队列理解及实现(链表,附完整代码)

队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(head)进行删除操作,而在表的后端(tail)进行插入操作,和栈一样,队列是一种操作受限制的线性表。进行插入操作的端称为队尾,进行删除操作的端称为队头。3. 队列的入队和出队操作:入队操作需要将元素添加到队尾,出队操作需要将队首的元素取出。在入队和出队操作中,需要考虑队列的边界情况,例如队列已满时无法入队,队列已空时无法出队。2. 队列的存储方式:可以使用数组(顺序表)或链表来存储队列中的元素。4. 队列的效率:在实现队列时,需要考虑队列的效率。

2024-04-08 00:09:35 406

原创 栈及其实现(附完整代码实现)

使用malloc函数分配大小为Stack的结构体大小的内存空间,将其转换为Stack类型的指针,将之赋值给变量stack,将首地址给stack->top,表示栈顶为空,最后将大小初始化为0,表示栈目前为空栈。如果不是相同的类型,或者栈中并没有左括号,那么字符串 无效,返回 False。最后,打印了栈的内容,并销毁了栈。当我们遇到一个左括号时,我们会期望在后续的遍历中,有一个相同类型的右括号将其闭合。需要注意的是,这个栈的实现是基于动态内存分配的,因此在使用完毕后需要调用 destroy 函数释放内存。

2024-04-07 14:28:21 499

原创 快速排序与qsort的实现与剖析

选择一个基准元素,然后将数组中所有其他元素与该基准元素进行比较,并根据比较结果将它们放在基准元素的两侧,从而将数组分为两个子数组。应该传入一个比较函数地址,比较两个数据的大小(如果是字符串,则使用string里面的字符串比对,通过比较ASCII的值来实现类似操作),传入的数据类型是不确定的,定义霍尔法sort函数,选择数组最后一个元素为基准元素,然后对两个子数组分别进行快排,直至子数组长度为1或2。此时,整个元素序列被划分为两个部分,第i个位置前的元素都小于a[i],第i个位置后的无素都大于等于a[i]。

2024-04-03 20:20:54 933 1

原创 单链表基础操作及实现

借用别的大佬的一些图,帮助我更好的去理解

2024-04-01 13:02:08 1357 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除