# Structurealgorithm **Repository Path**: cyhgyq/structurealgorithm ## Basic Information - **Project Name**: Structurealgorithm - **Description**: 数据结构和算法学习 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2022-04-14 - **Last Updated**: 2023-04-10 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 一、稀疏数组sparsearray 使用场景,五子棋黑子和白子存盘退出和续上盘的功能。 压缩数据量 当一个数组中大部分元素为0,或者为同一个值得数组时,可以使用稀疏数组来保存 使用方法:第一行记录数组一共有几行几列,数组中有几个值要记录 把具有不同值的元素的行列及值记录在一个小规模的数组中,从而缩小程序的规模 得到的数组时列数为3,行数为第一行第三列的值+1 算法分析:二维数组转稀疏数组的思路: 遍历原始的二维数组,得到有效数据的个数sum 根据sum就可以创建稀疏数组sparseArr int[sum+1][3] 将二维数组的有效数据存入到稀疏数组 稀疏数组转原始的二维数组的思路 先读取稀疏数组的第一行,根据第一行的数据,创建原始的二维数组,比如上面的chessArr2=int[11][11] 再读取稀疏数组后几行的数据,并赋值给原始的二维数组即可。 # 二、队列是一个有序列表,可以用数组或链表实现。 先入先出原则 实现思路:数组方式: 两个变量记录队头front和队尾rear. 最大容量maxSize. 使用的是环形数组,用取模来实现。 front表示指向队列的第一个元素。arr[front%maxSize]就是队列的第一个元素 rear表示最后一个元素的后一个位置 队列满时的条件:(rear+1)%maxSize = front 队列空的条件:rear == front front的初始值为0, rear的初始值为0, 最后一个空间预留出来不放数据,也就是最多放maxSize-1个数据。 如果不预留算法就得变更 当我们这样分析,队列中有效的数据个数(rear + maxSize - front) % maxSize # 三、单链表 链表反转: 从头到尾两个之间相互反转,并且用一个temp_node记录一下后面一个的下一个节点, head_node也要改变一下位置。 逆序打印: 使用栈的先进后出的特点,将所有节点入栈,然后再出栈。 # 四、双向链表 删除:不需要辅助节点,直接用node.prev.next = node.next; node.next.prev = node.prev; # 五、单向环形链表 应用场景:Josephu(约瑟夫问题),有1...n个小孩围成一圈,数到2的某个小孩出列,从而得到一个出队序号。 (也可以数组取模的方式实现) # 六、栈 栈的应用场景 子程序的调用、处理递归调用、表达式的转换、二叉树的遍历、图形的深度优先搜索法 用栈来实现计算器有:前缀、中缀、后缀表达式 # 七、递归 用于解决什么样的问题 数学问题:8皇后问题、汉诺塔问题、阶乘问题、迷宫问题、球和篮子的问题 算法问题:快排、归并排序、二分查找、分治算法 用栈解决的问题也可以用递归解决 球和篮子的问题:如果2个球放到2个篮子里,可以采用3中方式,即(0,2), (1, 1), (2, 0) 八皇后的问题:8x8的格子,任意两个皇后都不能处于同一行、同一列、同一斜线上,问有多少种摆法 思路分析:例子Queue8.java 1)第一个皇后先放第一行第一列 2)第二个皇后放在第二行第一列,然后判断是否ok,如果不ok,继续放在第二例、第三列、依次把所有的列都放完,找到一个合适的 3)继续第三个皇后,还是第一列、第二列...直到第8个皇后也能放到一个不冲突的位置,算是找到了一个正确的解。 4)当得到一个正确的解时,在栈回退到上一个栈时,就会开始回溯,即将第一个皇后,放到第一列的所有正确解全部得到 5)然后回头继续第一个皇后放到第二列,后面继续循环执行1、2、3、4的步骤 # 八、排序算法 常见的排序算法: 插入排序:直接插入排序、希尔排序 选择排序:简单选择排序、堆排序 交换排序: 冒泡排序、快速排序 归并排序: 基数排序: 算法的时间复杂度从小到大依次为:o(1) < o(log 2 n) < o(n) < o(nLog 2 n) < o(n2) < o(n3) < o(nK) < o(2N) 各种算法的时间复杂度对比 排序法 平均时间 最差情形 稳定性 额外空间 备注 冒泡 o(n 2) o(n 2) 稳定 o(1) n小时比较好 交换 o(n 2) o(n 2) 不稳定 o(1) n小时比较好 选择 o(n 2) o(n 2) 不稳定 o(1) n小时比较好 插入 o(n 2) o(n 2) 稳定 o(1) 大部分已排序是较好 基数 o(nlogRB) o(nlogRB) 稳定 o(n) 内存耗太多,只支持正整数,不推荐 shell o(nlogn) o(ns) 1