自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 数据结构与算法 分支限界算法(开始篇)

/装载问题:(有一批共n个集装箱要装上2艘装载重量分别为c1,c2的轮船,其中集装箱i的重量为wi,且要求确定是否有一个合理的装载方案可以将这n个集装箱装上这2艘轮船。if (cw + r >= bestw) {//这里的等于不能减,负责无法选择到叶子节点上(死记就好)c=20的时候去测试一下。//恢复cw和i的值,表示从i节点跳到广度遍历的下一个节点了。//恢复cw和i的值,表示从i节点跳到广度遍历的下一个节点了。//死节点:就是你从根节点走到下一个节点,那么这个时候根节点就变成了死节点。

2024-10-10 10:52:31 471

原创 数据结构与算法 贪心算法

/之前对柜台服务的时间进行了升序排序了,所以如果找到了一个,后面就不用看了。//部分背包问题,有n个物体,第i个物体的重量为wi,价值为vi,在重量不超过c的情况下让总价值尽量高,//m个柜台提供服务,每个柜台给一个用户提供服务的时间为t(用数组表示每一个柜台提供服务的时间),//有1,3,5分的硬币,给定一个价值c:11,问组成价值c需要的最少的硬币的数量?//记录每一个柜台安排的用户的数量。//在遍历其它的柜台,看一下可不可以花费更少的时间。//问怎么排列,时的柜台给所有的用户提供服务的时间最少。

2024-10-10 10:45:39 382

原创 数据结构与算法 动态规划算法

/为什么是n+1因为在实际上写的时候,数组的下标是从0开始的,如果你写了n的话,那在存储的过程中,是存储面值为0的时候要多少个硬币,面值为n-1的时候要多少个硬币,//dp[n][m]:n表示第一个串的长度,m表示第二个串的长度,n行m列元素的值,记录的就是这两个串的LCS的长度。//硬币选择问题:有1,3,5分面额的硬币,给定一个面值11,问组成给定面值所需要的最少的硬币数量是多少?//组成价值为n需要的硬币最少的数量,if (path[n][m] == 1) {//对于位置的元素是相等的。

2024-10-09 21:31:12 938

原创 数据结构与算法 分治算法

else if (pos < vec.size() - k) {//topk应该在基准数的右边。if (i >= j) {//子问题划分到一个元素的时候,就代表子问题的解是已知的了。if (i == length1) {//nums1数组的元素太少,而且值都特别的小。//找第k大的,相等于找第vec.size()-k小的下标(有第0个小的下标)//求第if(pos==vec.size(10(k=10)大的元素。else if (j == 0) {//nums2特别短。//分治算法-------归并算法。

2024-10-09 21:30:16 978

原创 数据结构与算法 分支限界算法

/节点的价值上界,从这个节点往下,最多能选择的物品产生的总价值(就是这个节点已经选择的物品的价值加上所有下面还没有选择物品的价值(就是假设下面1都已经选择了))const int n = sizeof(w) / sizeof(w[0]);//装入背包的物品的最优价值。//装入背包的物品的最优价值。//已选择物品的总重量。

2024-10-09 21:28:47 871

原创 数据结构与算法 回溯算法

if (i == j || arr[i] == arr[j]||abs(arr[i]-arr[j])==abs(i-j)) {//分别代表同一行,同一列,同一斜线上,为什么同一斜线上不写arr[i]==j,因为可能一个在(2,4),你要写的那个数在(6.0)上。//整数选择问题:给定2n个整数,从里面挑选出n个整数,让选择的整数和,和剩下的整数的和的差最小(目标不明确)//整数选择问题:给定一组整数,从里面挑选出一组整数,让选择的整数和,和剩下的整数的和的差最小(目标不明确)

2024-10-09 21:28:09 628

原创 数据结构与算法 红黑树

if (color(brother->left_) == BLACK && color(brother->right_) == BLACK) {//情况3。if (color(brother->left_) == BLACK && color(brother->right_) == BLACK) {//情况3。if (color(brother) == RED) {//情况4。if (color(brother) == RED) {//情况4。if (RED == color(uncle))//情况1。

2024-10-09 21:27:27 512

原创 数据结构与算法 AVL树

/AVL树,二叉平衡搜索树(节点平衡:任意节点左右子树的高度差不能超过-1,0,1)//节点失衡,由于左孩子的左子树太高了。//节点失衡,由于左孩子的右子树太高了。//节点失衡,由于右孩子的右子树太高了。//节点失衡,由于右孩子的左子树太高了。//为了避免删除后,造成了节点失衡,谁高删除谁。//右孩子的右子树太高了。

2024-10-09 21:23:28 568

原创 数据结构与算法 BST树

if (parent == nullptr) {//在只有根节点和一个其它节点的情况下,不经过if (cur->left_!//递归实现求二叉树节点的个数,求以node为根节点的子树的节点的总数并返回节点的总数。//在遍历右边的节点。cout << "不插入元素相同的值" << endl;cout << "非递归前序遍历" << endl;cout << "非递归层序遍历" << endl;

2024-10-09 21:22:47 1054

原创 数据结构与算法 快排分割

/求值最小的前三个元素。//求Top key的函数。

2024-10-09 21:19:25 312

原创 数据结构与算法 大小堆根的问题

/ 这将创建一个最大堆。//放入大根堆的时候,需要放key-value键值对。//求vec中值最小的前5个元素。//求vec中值最大的前5个元素。//由前k个元素构建一个大根堆。//由前k个元素构建一个大根堆。//求重复次数最小的前3个数字。//求重复次数最大的前3个数字。//遍历剩余的元素,直到最后。//遍历剩余的元素,直到最后。

2024-10-09 21:18:54 284

原创 数据结构与算法 链式哈希表的实现

/ 2.在多线程的环境中,有线程的安全问题,在多线程的情况下,对同一个数组进行存储,查询,删除是不太行的,在多线程的环境下,线性探测哈希表对数组中不同位置进行写的时候,可能会造成数据上的覆盖,但是链式哈希表不会。// 1.发生哈希冲突的时候,就有可能往后面一个一个找了,时间复杂度就接近o(n)了,存储,查询,删除变慢了。//当前使用的素数表的下标//不同的哈希表要定义不同的哈希表的大小。

2024-10-09 11:05:21 435

原创 数据结构与算法 线性探测哈希表的实现

/查询:1.通过哈希函数计算数据存放的位置,从该位置取值, 该值==要1查询的元素值,找到了,该值!//这个值没有存放的位置就会往后面继续找,直到有位置,所以只要有一个位置的状态是STATE_UNUSE,那就说明这个位置和往后的位置从来没有存放这个固定值,所以没有存放的必要性。//这个值没有存放的位置就会往后面继续找,直到有位置,所以只要有一个位置的状态是STATE_UNUSE,那就说明这个位置和往后的位置从来没有存放这个固定值,所以没有存放的必要性。

2024-10-09 11:04:15 731

原创 数据结构与算法 算法的常见问题

传入的要排序的数组,顺便传入数组的元素个数,每排序一次,元素的个数=(元素的个数>>1)+(元素的个数>>2),如果元素的个数<=0,就是差不多要满了。// 快速排序算法(数据量变有序的时候(待排序的个数为32),变成插入排序,如果元素非常恶劣(递归层数太多),就是快速排序的时间复杂度为o(n的平方),就使用堆排序)//传入的要排序的数组,顺便传入数组的元素个数,每排序一次,元素的个数=(元素的个数>>1)+(元素的个数>>2),如果元素的个数<=0,使用堆排序。//如果达到递归深度了还没排完序怎么办?

2024-10-08 21:53:08 390

原创 数据结构与算法 堆排序2

while (i <size/2)//size-1获取最后一个元素节点的下标,再减1并且除以2获取最后一个非叶子节点的下标 =((size-1)-1)/2=size/2-1会为负数,所以使用<size/2会更好,因为i必须是整数,所以<=size/2-1和<size/2没有区别。//不管是快排还是归并排序,遍历元素的时候,都是按照顺序遍历的,对cpu缓存是友好的(cou缓存命中率高),但堆排序访问元素是按照父子节点访问的,并不是顺序访问的,所以不管是上浮调整还是下浮调整,对cpu缓存不好。

2024-10-08 11:44:35 304

原创 数据结构与算法 堆排序

if ((child + 1 < size_)&&comp_(que_[child+1],que_[child]))//如果大于或者等于就没有右孩子了。while(i<=((size_-1)-1)/2)//size_-1是为了得到新数组的最后一个节点,再-1然后/2为了得到父节点的下标。//在数组中,下标从0到i,如果在完全二叉树中,当前节点的下标为i,那么左孩子的下标为2*i+1,右孩子的下标为2*i+2;//满足0<=i<=(n-1)/2,n是最后一个元素的下标,那么满足的下标为i的元素,只要满足。

2024-10-08 11:28:36 474

原创 数据结构与算法 归并排序

/时间复杂度最好最坏平均都是为O(n*log以2为低的n次方),因为都是对半分的,层*每一层要和并的数据量o(n)//稳定性:在原始的数据序列中,相同元素经过排序后,他们的前后顺序并没有改变,但位置可能改变,就叫稳定,否则不稳定。//在归的时候,开辟一个内存空间,将两个分支的数进行比较,谁小就进去,然后代替他们的父节点。//空间复杂度为O(n),因为类似于二分,所以每次只有一组数据进行比较,比较完就删掉。//在递的时候,求中间数,不断地分为两个,直到只有一个数。//归并算法(二路归并)

2024-10-08 11:10:19 367

原创 数据结构与算法 快速排序优化

/优化2基准数尽量选择可以到中间,用三个数取中,位置最left,位置最right ,位置为(left + right)/2,取3个中,数值在中间的数。//在快速排序中,随着快速排序的进行,排序的规律越来越有序,所以可以使用插入排序优化算法。//就是3个数比较大小,取值为中间的数跟最左边的数交换位置,进行排序。//时间复杂度是O(n*log以2为低的n),最坏是O(n的平方),//空间复杂度O(log以2为低的n) - O(n),因为深度大。

2024-10-08 11:09:47 324

原创 数据结构与算法 快速排序

/空间复杂度O(log以2为低的n)【我觉得应该是一次只有一个分支在栈上开辟内存,开辟完了回收完内存空间才轮到另外一个分支开辟内存】 或 O(n)【从左到右都是从小到大排序的】,因为深度大。//选择一个基准数,把小于基准数的元素放到基准数的左边,把大于基准数的数放到基准数的右边,任何对基准数的左边和右边的序列继续进行这样的操作,直到整个序列变得有序的。//时间复杂度最好和平均是O(n【有多少个数需要排序】*log以2为低的n【树的速度是多少】),最坏是O(n的平方)【从左到右都是从小到大排序的】,

2024-10-08 09:59:47 464

原创 数据结构与算法 希尔排序

gap/=2) {//这个和二分搜索的很像,数字越大,影响不是很大,随着搜索的数量的增加,因为分组对性能小,所以不关心 size是代表有多少个元素,gap代表一个组中的两个元素间隔了多少个元素。//稳定性:不稳定 5 3 5 3 5 3 3 3 3 5 5 5 gap为3。//插入,冒泡,选择空间平均复杂度为O(n的平方),希尔为O(n的1.3次方)//时间复杂度最好是O(n),最坏是o(n的平方)//冒泡排序<选择排序<插入排序<希尔排序。//空间复杂度O(1)

2024-10-08 09:58:07 344

原创 数据结构体与算法 插入排序

/插入排序就是一开始第一个数不动,从第二个数开始往前找,找到比它大的数就放到他的后面,如果都比它大,就放到最前面,然后第一个数和第二个数不动,从第三个数字开始找,以此类推。//如果数据有序,插入算法是所有排序中算法(包括高级和低级算法)最快的。//时间复杂度最好是O(n),最坏和平均是o(n的平方)//在基础排序算法中,插入排序>冒泡排序and选择排序。//稳定性:稳定 //相等的不会跑到人家前面去。//空间复杂度O(1)

2024-10-08 09:52:19 205

原创 数据结构与算法 选择排序算法

/选择排序,定位一个元素,与后面的元素交换,最小的那个元素放到定位的那个位置上,然后定位下一个元素。//时间复杂度最好最差平均都是O(n的平方) (1+n)*n/2。//稳定性:不稳定 //5 5 3 //3 5 5。//空间复杂度O(1)

2024-10-07 23:11:03 375

原创 数据结构与算法 冒泡排序

j++) {//为什么要减少i,因为每一趟都会把最后一个数字排好,就可以少排一个了,而每一趟i都加1 //1*2*3.....*n o(n)//稳定性:在原始的数据序列中,相同元素经过排序后,他们的前后顺序并没有改变,但位置可能改变,就叫稳定,否则不稳定。if (arr[j] > arr[j + 1]) {//相邻的元素相互比较。//时间复杂度最差和平均都是为O(n的平方) (1+n)*n/2。//稳定性为稳定 //在冒泡中,只有上面的值大于下面的值才会换位置。

2024-10-07 23:07:43 269

原创 数据结构与算法 二分搜索(递归)

int BinarySearch(int arr[], int i, int j, int val) {//调用一个函数就会开辟一个栈,栈的大小相比于堆是小的,所以不要搞太多函数栈,会把栈区搞溢出。//在数组arr中的【i,j】的范围中,二分搜索val,找到的话返回下标,找不到返回-1。//递归代码的具体执行是垂直方向上的。//递归不要用在需要很大计算的值中。//递归代码的思考是水平方向上的。

2024-10-07 22:53:19 172

原创 数据结构与算法 二分搜索(非递归实现)

int BinarySearch(int* arr, int size, int val) {//bst树。//有序序列的时间复杂度为h = O(log (2) n),n是数据量,h是搜索多少次。//线性搜索,就是从头往尾巴变量,时间复杂度为o(n)//二分搜索算法也叫折半搜索算法, 只能给有序地序列。cout << "没找到" << endl;

2024-10-07 22:51:52 225

原创 数据结构与算法 用两个队列实现栈

/交换一下p1和p2的数据。int pop() {//这里应该判断一下p2是否为空。int top() {//这里应该判断一下p2是否为空。

2024-10-07 21:57:52 333

原创 数据结构与算法 两个栈实现一个队列

if (s2.empty()) {//其实这里应该判断一下s1是否和s2一样为空,如果为空,那么报错,返回。if (s2.empty()) {//其实这里应该判断一下s1是否和s2一样为空,如果为空,那么报错,返回。//获取队头元素 o(n)//查看是否为空 o(1)

2024-10-07 21:55:04 320

原创 数据结构与算法 环形队列

/基于双向循环链表的链式队列。//判断是否为kong。

2024-10-07 21:53:12 440

原创 数据结构与算法 队列

/如果去遍历,那么就变成了o(n)的操作了,我这样写就是一个o(1)的操作。//获取队尾元素 对头的位置始终有数字,队尾没有。//对头的下标(有0)int m_rear;//队尾的下标(有0)//下面演示环形队列,用数组实现;//环形队列:数组实现。//链式队列:链表实现。

2024-10-07 21:48:46 410

原创 数据结构与算法 链式栈

int m_size;//记录链表的长度,这样获取链表的长度的时候,就可以不用去变量链表了,时间复杂度从o(n)变成了o(1)//链表的头是栈顶的位置。

2024-10-06 23:26:42 346

原创 数据结构与算法 栈

/顺序栈就是以数组的形式来实现的,链式栈就是以链表的形式来实现的。//栈:先进后出,后进先出。//下面演示的是顺序栈。

2024-10-06 23:26:06 397

原创 数据结构与算法 双向循环链表

/不管p的前节点,是因为我认为不需要用到它,所以不写。//删除第一个值为val的节点。//定义双向循环链表的节点类型。//链表对节点的输出。

2024-10-06 23:25:20 376

原创 数据结构与算法 双向链表

/删除第一个值为val的节点。//链表对节点的输出。//定义双向链表的节点类型。

2024-10-06 23:24:25 487

原创 数据结构与算法 单向循环链表

/数到m的那个人出列,它的下一个人又从1开始报数,数到m的那个人又出列,依此规律重复下去,直到圆桌周围的人全部出列,输出人的出列顺序。//约瑟夫环是一个数学的应用问题 : 已知n个人(以编号1,2,3...n分别表示)围坐在一张圆桌周围,从编号为k的人开始报数,cout << "删除的节点的数据为" << p->m_data << " ";//下面演示的是,最后一个节点,指向带头节点的地址,不是带头节点的下一位。cout << "约瑟夫环问题 " << endl;//删除p指向的节点。

2024-10-06 23:11:11 310

原创 数据结构与算法 链表

/插入可能不是O(1),如果尾插法中链表有尾指针,那么就是O(1)//删除本身是O(1),不包括搜索O(n)//旋转链表 给你一个带头的链表,旋转链表,让链表的每个节点向右移动k个位置,如果最后面的节点越界了,那么就跑到第一个节点的位置。cout << "单链表判断是否有环,求环的入口节点" << endl;//单链表判断是否有环,求环的入口节点,存在返回环的入口节点;cout << "删除链表的倒数第n个节点" << endl;cout << "单链表的倒数第几个结点" << endl;

2024-10-06 22:51:36 979

原创 数据结构与算法 数组

/如果你有两个指向相同类型的指针 p1 和 p2,并且它们都指向同一个数组中的元素或者在该数组范围之外但不超过数组的边界,//查询元素地址(位置包括0)//o(n)如果是有序的,可以使用二分搜索,为log以2为低的n。cout << "整形数组,把偶数调整到数组的左边,把奇数调整到数组的右边" << endl;//整形数组,把偶数调整到数组的左边,把奇数调整到数组的右边。//整形数组,把偶数调整到数组的左边,把奇数调整到数组的右边。//指向可扩容的数组内存;//按位置增加元素(位置包括0)//o(n),

2024-10-06 22:42:17 352

原创 数据结构与算法地基本概念

逻辑结构逻辑结构主要关注数据元素之间的逻辑关系,而不考虑它们在计算机中的具体存储细节,而物理结构则决定了这种组织方式在内存中的具体实现。在实际应用中,一个好的数据结构设计应该同时考虑到逻辑结构的合理性和物理结构的效率。逻辑结构指的是数据元素之间的关系以及对这些数据的操作,而与它们在内存中的实际存储位置无关。逻辑结构关注的是数据的组织形式,即数据元素之间的逻辑关联性。非线性结构:如树形结构(树、二叉树)、图结构等,数据元素之间存在多对多的关系。线性结构:如数组、链表等,其中的数据元素按顺序排列。

2024-10-06 22:39:57 283

原创 c++设计模式

13,模板方注模式(Template Hethod Pattern)22,解释器模式(Interdreter Pattern)10,组合模式(Composite Pattern)12,享元模式(Flyueight Pattern)16.,策略模式(strategy Pattern)5,原型模式(Prototype Pattern)20,访问者模式(visitor Pattern)4,建造者模式(Builder Pattern)8,适配器模式(ndapter Pattern)

2024-10-05 16:49:06 339

原创 设计模式 迭代器模式

/让迭代器 持有一个 集合的 引用。//让当前 游标 回到位置0。virtual bool IsDone()//看一下迭代器是否到终点了。//迭代器模式:持有一个集合的引用,所以通过迭代器,就可以访问集合。

2024-10-05 16:21:55 288

原创 设计模式 解释器模式

/并建立一个解释器来处理这个语言的句子。这个模式通常用于处理文本命令、数学公式或者简单的领域特定语言(DSL, Domain Specific Language)。//解释器模式:解释器模式(Interpreter Pattern)是一种行为设计模式,它允许您定义一个语言的语法,

2024-10-05 16:13:26 300

空空如也

空空如也

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

TA关注的人

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