自定义博客皮肤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)
  • 收藏
  • 关注

原创 哈希C++

理想情况是找出⼀个好的哈希函数避免冲突,但是实际场景中,冲突是不可避免的,所以我们尽可能设计出优秀的哈希函数,减少冲突的次数,同时也要去设计出解决冲突的⽅案。(黄金分割点1)比较好。,P需要选一个足够大的质数,a随机选[1,P - 1]之间的任意整数,b随机选[0,P - 1]之间的任意整数,这些函数构成了一个 P × (P - 1) 组全域散列函数组。,hash0,hash1,hash2位置已经存储数据了,后续映射到hash0,hash1,hash2,hash3的值都会争夺hash3位置,这种现象叫。

2024-11-26 22:35:52 871

原创 红黑树实现

(4)规则4,前序遍历检查,遍历过程中用形参记录根到当前节点的blackNum(黑色节点的数量),前序遍历遇到黑色节点就++blackNum,走到空就算出了一条路径的黑色节点数量。因为p和u都为红色,g为黑色,把p和u变黑,左边子树路径各增加一个黑色节点,违反了规则4,因此g变为红色,能够在保持g所在子树到NULL的各个路径上的黑色节点数量不变,同时还能解决c和p连续红色节点的问题。(3)规则3,前序遍历检查,遇到红色节点查孩子不太方便,因为孩子有两个,且不一定存在,反过来检查父亲的颜色就方便很多。

2024-11-04 23:24:52 565

原创 AVL树实现

因为 10 < b子树的值 < 15,将b变成10的右子树,10变成15的左子树,15变成这棵树新的根,符合搜索树的规则,控制了平衡,同时这棵的高度恢复到了插入之前的h+2,符合旋转原则。f子树高度从 h - 1并为 h 并不断更新 12 -> 15 -> 10平衡因子,引发旋转,其中12的平衡因子为 1,旋转后15和12平衡因子为0,10平衡因子为-1。Ⅲ:插入节点,会增加高度,插入到 parent 的右子树,parent 的平衡因子++,插入到 parent 的左子树,parent 的平衡因子–。

2024-11-01 11:49:55 665

原创 map 和 set 的使用

(1)set 的声明如上,T 是 set 底层关键字的类型。(2)set 默认要求T支持小于比较,如果不支持或者想按自己的需求走,可以自行实现仿函数传给第二个模板参数。(3)set 底层存储数据的内存是从空间配置器申请的,如果需要可以自己实现内存池,传给第三个参数。(4)一般情况下,都不需要传后两个模板参数。(5)set 底层是用红黑树实现,增删查效率是O(logN),迭代器遍历是通过搜索树的中序,所有是有序的。(1)map 的声明如上,T 是 map 底层value的类型。

2024-10-28 21:13:16 787

原创 C++多态

多态是一个继承关系下的类对象,去调用同一函数,产生了不同的行为。比如Student继承Person。Person对象买全价票,Student对象买学生票。

2024-10-24 20:34:39 585

原创 C++继承

继承是使代码可以复用增加成员函数,和成员变量。这样产生新的类,称为派生类。下面我们通过一段代码来具体感受一下:在上述代码中,Student和Teacher两个类中具有一些相同的成员变量和成员函数,比较冗余。我们可以用继承的方式来减少代码的冗余。我们将公共的成员放到Person类中,然后用Student和Teacher继承Person,这样就可以复用这些成员,而且不需要重复定义。在前面我们看到的Person是基类/父类。Student和teacher是派生类/子类。

2024-10-20 19:06:10 1132

原创 排序(插入,希尔,选择,堆,冒泡,快速,归并,计数)

直接插入排序的基本思想:通过取一个数a与前面的数比较,a小则将前面的数后移,a继续向前比较,直到找到比a更小的数,插入到该位置。代码实现:2.希尔排序:希尔排序的基本思想:先选定一个整数gap,将需要排序的内容分为gap组,所有的距离为gap的在同一组,并对每一组内的数进行排序。然后重复上述操作,直到gap减为1。我们来看一下分步图:希尔排序就是对直接插入排序的优化,当gap > 1时都是在对数组进行预排序,当gap = 1时,此时的数组已经接近有序了,且当gap为1时,我们代入到希尔排序的代码中,

2024-09-04 11:42:17 828 1

原创 C++ 模板

(推荐使用)

2024-08-18 19:18:48 1015

原创 C++内存管理

申请自定义类型的空间时,new会调用构造函数delete会调用析构函数,而malloc和free不会。(1)new 的原理:•调用operator new申请空间•在申请的空间上执行构造函数,完成对象的构造(2)delete 原理:•在空间上执行析构函数,完成对象中资源的清理工作•调用operator delete释放对象的空间(1)new T[N] 的原理:•调用operator new[],在operator new[]中实际调用operator new完成对N个对象空间的申请•。

2024-08-17 18:25:10 1077

原创 C++类和对象

(1)class为定义类的关键字,Date为类的名字,{}中为类的主体,类定义结束时后面分号不能省略。类体中内容称为类的成员:变量称为类的属性或成员变量;函数称为类的方法或成员函数class Dateprivate:// 为了区分成员变量,⼀般习惯上成员变量会加⼀个特殊标识,如_ 或者 m开头int _year;int _month;int _day;(2)为了区分成员变量,⼀般习惯上成员变量会加⼀个特殊标识,如_ 或者 m开头。C++中这个并不是强制的,只是⼀些惯例。

2024-08-15 21:06:02 1055

原创 C++入门基础

•定义命名空间,需要使用namespace关键字,后面跟命名空间的名字,然后接一对{},{}中即为命名空间的成员。命名空间中可以定义变量/函数/类。•namespace本质是定义出一个作用域,这个域跟全局域相互独立,不同的域可以定义同名变量,所以下面的rand就不会存在冲突了。// 命名空间中可以定义变量/函数/类型int val;int main()// 这⾥默认是访问的是全局的rand函数指针// 这⾥指定bit命名空间中的randreturn 0;•。

2024-08-13 19:36:41 823

原创 文件详解(C代码)

在日常中,我们写的程序的数据是存储在电脑的内存中的,那么当程序退出后,内存被回收,这时数据就会遗失,当我们下次运行程序的时候,是看不到上次的数据的。文件的内容不一定是一段程序,也可能是程序运行时读写的一些数据,比如程序运行需要从中读取数据的文件,或者输出内容的文件。每当打开文件时,系统会根据文件的情况自动创建一个FILE结构的变量,并填充其中的信息,使用者不必关心细节。如果要求在外存上以ASCLL码的形式存储,在需要在存储前转换。,用来存放文件的相关信息(如文件的名字,文件状态及文件当前的位置等)。

2024-05-29 17:30:54 1047

原创 C语言自定义类型详解

C语⾔已经提供了内置类型,如:char、short、int、long、float、double等,但是只有这些内置类型还是不够的,假设我想描述学生,描述⼀本书,这时单⼀的内置类型是不行的。描述⼀个学生需要名字、年龄、学号、身高、体重等;描述⼀本书需要作者、出版社、定价等。C语言为了解决这个问题,增加了结构体这种⾃定义的数据类型,让程序员可以自己创造适合的类型。结构是⼀些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量,如:标量、数组、指针,甚⾄是其他结构体。int x;int y;

2024-05-17 13:24:38 825

原创 大小端字节序

其实超过⼀个字节的数据在内存中存储的时候,就有存储顺序的问题,按照不同的存储顺序,我们分为大端字节序存储和小端字节序存储,下⾯是具体的概念:大端(存储)模式:是指数据的低位字节内容保存在内存的高地址处,而数据的高位字节内容,保存在内存的低地址处。小端(存储)模式:是指数据的低位字节内容保存在内存的低地址处,而数据的高位字节内容,保存在内存的高地址处。上述概念需要记住,方便分辨大小端。

2024-05-17 13:22:32 270

原创 栈与队列的实现

因为我们在初始化时将top设置为0,但此时栈中并未有元素,而数组的首元素则是从0下标开始,在后面的入栈中,top在每一次入栈后都会+1,因此top的指向并非为栈顶元素,而是栈顶元素的下一位。队列:只允许在一端进行插入数据操作,在另一端进行删除数据操作的特殊线性表,队列具有先进先出FIFO(First In First Out)队列也可以数组和链表的结构实现,使用链表的结构实现更优一些,因为如果使用数组的结构,出队列在数组头上出数据,效率会比较低。,其只允许在固定的一端进行插入和删除元素操作。

2024-05-15 12:08:04 253

原创 浮点数在内存中的存储

因此,此时的有效数字M不再加上第⼀位的1,而是还原为0.xxxxxx的小数。IEEE 754 规定,在计算机内部保存M时,默认这个数的第⼀位总是1,因此可以被舍去,只保存后⾯的xxxxxx部分。对于64位的浮点数,最⾼的1位存储符号位S,接着的11位存储指数E,剩下的52位存储有效数字M。对于32位的浮点数,最⾼的1位存储符号位S,接着的8位存储指数E,剩下的23位存储有效数字M。n的值:以整数的形式存储到n中的9,以%d(整数形式)打印,结果为9。例如:0.5 的二进制形式为0.1,表示的时候为(-1)

2024-05-06 12:14:20 972

原创 C语言内存函数

若destination大于source时,我们应当将source中从后向前的将内容拷贝进入到destination中去若destination小于source时,我们应当将source中从前向后的将内容拷贝进入到destination中去除了上述两种情况外,若两者内存未重叠,从前到后与从后向前都可以达成拷贝的目的。

2024-03-24 15:51:16 774 1

原创 分支与循环语句

也就是表达式的结果如果是0,则语句不执⾏,表达式的结果如果不是0,则语句执⾏。例:如果大于等于140,则表明他是一个天才,输出“Genius”。

2023-12-03 23:33:27 897 1

原创 printf函数:格式化输出函数

如上图,%5d 表⽰这个占位符的宽度⾄少为5位。如果不满5位,对应的值的前⾯会添加空格。若希望左对齐可在占位符的 % 的后⾯插⼊⼀个 - 号(如下所示)。上图中“I am %d years old.”中的%d就是一个占位符,该位置最终被后面的19代入占据。如果参数个数少于对应的占位符, printf() 可能会输出内存中的任意值。的两个星号通过 printf() 的两个参数5和2传入。第二个参数就是替换占位符的值,如上面的整数19替换%d。“占位符”所占的位置,可由其他值代入。, printf() 的。

2023-11-25 12:53:31 574

原创 *p++、*(p++)、*++p、*(++p)、(*p)++、++*p区别和用法

按从右向左的结合原则,++*p求值的顺序即为先进行“*”,然后再进行“++”运算,即先取出*p的值并赋给a,然后将*p的值arr[1]加1,但*p指向的内容不变。由于括号内优先运算,所以表达式先取出*p(假设为arr[1])的值并赋给a,然后讲*p的值arr[1]所代表的内容加1。再根据p++的运算先取值再自增,即为先取*p,然后进行p++的自增操作。再根据++p的运算先自增再取值,即为先进行p++的自增操作,然后取*p。此时*p指向的内容会发生改变,变为数组的下一位。--变量名/变量名--

2023-11-18 23:35:44 9570 14

空空如也

空空如也

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

TA关注的人

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