算法与数据结构
慢慢来,努力就会成功
StepByStep~
这个作者很懒,什么都没留下…
展开
-
堆排序(heapsort)与比较器
堆结构:(1)逻辑概念上:完全二叉树(满二叉树或者是从左往右依次变满的二叉树)(2)存储表示:数组从0出发的连续一段表示一颗完全二叉树,使用size描述该树有多少结点,在i位置上的结点,其左孩子下标为(2*i+1),右孩子下标为(2*i+2),父节点为(i-1)/2.(3)分类:大根堆:堆顶为整个堆最大的元素小根堆:堆顶为整个堆最小的元素...原创 2022-05-25 17:16:33 · 228 阅读 · 0 评论 -
快排及荷兰国旗问题
问题一:将某一范围[L,R]中的数按照给定值的target,分为左半部分为<=target的数,右半部分为>target的数解决过程:定义两个变量less和i,less用于指示当前<=区域的边界位置,初始值为L-1,i用于遍历该范围的数。当arr[i] <= target时,将arr[i]和less下一个位置的元素交换,less++;否则,i++整体上就是i用于遍历待定区域, <=target的区域不断向右扩张,压缩待定区域,中间是>target的区域 //原创 2022-05-24 22:22:49 · 265 阅读 · 0 评论 -
递归及归并排序
递归:(1)master公式:,用于求解子问题规模相同的递归行为的时间复杂度,其时间复杂度根据 a,b,d之间的关系确定如下:;;;其中:N是母问题的规模,a是递归问题的调用次数,b是母问题被分解成了多少个等规模的子问题,第二个加数部分是除子问题外剩余部分的时间复杂度归并排序:整体外排序,即使用额外空间,排好序后,再将额外空间中的数据拷贝回原数组原理:将原数组分为左右两半,分别使左一半有序和右一半有序,然后再将这两半合并成一个有序的数组。使用递归,左一半还可以再分,右一半同理原创 2022-05-24 14:09:21 · 213 阅读 · 0 评论 -
二分法及对数器
二分法:区分两种写法:(一):target在闭区间【left,right】中时:right初始值取(len - 1),当(target < arr[mid])时,right = mid - 1.(因为闭区间一定取不到mid)(二):target在左闭右开【left,right)中时:right初始值取len,当(target < arr[mid])时,right = mid .(因为闭区间可能取不到mid)题目一:在arr中找出目标值的位置 /** * 二原创 2022-05-23 10:23:40 · 131 阅读 · 0 评论 -
简单排序算法及异或运算
1. 时间复杂度的注意事项:当时间复杂度相同,要实际进行操作才能比较,因为算法的常数执行时间是不同的。简单排序算法:(这几种排序算法都不受数据状态的影响)(一)选择排序:从0位置开始,找到最小(最大)值与0位置元素交换;从1位置开始往后找剩下元素中最大(最小)元素与1位置元素交换,直到倒数第二个元素以后找出最小(最大)交换以后有序。 /** * 选择排序 */ public static void selectSort(int[] arr){ int原创 2022-05-23 09:57:20 · 221 阅读 · 0 评论 -
红黑树&平衡二叉搜索树(AVL)
平衡因子:左子树高-右子树高红黑树(red black tree_RBT)自(相对)平衡二叉查找树属于二叉平衡查找树(1)结点是黑色或者红色的(2)根属性:根节点必须是黑色(3)红色结点的孩子必须是黑色的,黑色结点的孩子可黑可红(从根出发到空叶子的简单路径,不存在连续红色结点)(4)空叶子结点是黑色(5)从根出发到所有空叶子的简单路径中,黑色结点数量相等(包括自身和空叶子)最短路径是全黑的路径;最长的路径是红黑相间的;最长路径<2*最短路径查找的时复OlogN红黑树的高度最多原创 2022-05-05 16:27:56 · 1016 阅读 · 0 评论 -
败者树学习
参考如果归并段的数据全部被弹出后该如何调整败者树呢?答:如果败者树用于求最大值,那么自己在全被弹出的归并段定义一个min;相反如果求最小值,则自定义一个max。对于k路的归并,在第一次构建败者树时需要比较(k-1)次。之后在选择时就可以利用败者树比较log2k向上取整 次。等于非叶子节点非冠军节点 的非终端节点的层数。在实际的代码实现中,使用数组保存非叶子节点的归并段序号,叶子结点是我们分析的时候虚拟的...转载 2021-11-18 11:10:31 · 257 阅读 · 0 评论 -
回溯与分支限界
https://www.cnblogs.com/gh110/p/11827726.htmlhttps://blog.csdn.net/zm1_1zm/article/details/69224626转载 2021-11-15 18:52:55 · 655 阅读 · 0 评论 -
子集树与排序树
子集树:该树仅仅对应解空间的子树,我们要求的是一个解,不同的路径对应不同的解,有的解可行,有的不满足要求,没有顺序的要求,只要把解以树的形式表示出来,例如,0/1背包问题的解树就是子集树,它不要求放入的顺序,只要求放入的序号排序树:是要求有顺序的,我们要求的是一种排列,不同的路径对应不同的方案解,这些解可能都满足题意,但是因为谁先出现和后出现是不一样的方案,所以我们往往要找出最优解或最小代价解。比如旅行商问题,作业分配问题。...原创 2021-11-13 17:04:59 · 2735 阅读 · 0 评论 -
作业分配问题——分支限界
问题描述:有n份作业分配给n个人去完成,每人完成一份作业。假定第i个人完成第j份作业需要花费cij时间, cij>0,1≦i,j≦n。参考内容import java.io.BufferedReader;import java.io.FileReader;import java.io.IOException;import java.util.*;public class Branch_Bound { static int[][] cost ;//每个工人执行每项工作所花的时间原创 2021-11-13 16:52:41 · 1495 阅读 · 0 评论 -
作业分配问题——回溯
import java.io.BufferedReader;import java.io.FileReader;import java.io.IOException;import java.util.ArrayList;import java.util.Collections;import java.util.Scanner;public class Test { private int n;//工人和作业的数量 private int[] isworked;//记录对应的工.原创 2021-11-13 16:46:31 · 497 阅读 · 0 评论 -
利用huffman编码对文本文件进行压缩与解压。
输入:一个文本文件输出:压缩后的文件算法过程:(1)统计文本文件中每个字符的使用频度(2)创建哈夫曼树、构造huffman编码(3)以二进制流形式压缩文件其中的遇到的问题:(1)哈夫曼树的总结点数为什么是(叶子结点个数*2-1)?解:设度为0的结点个数为n0,度为1的结点个数为n1,度为2的结点个数为n2总的结点个数=n0+n1+n2;从度的角度:总的结点个数等于总度数+1,因为每个结点都连着一个度,只有根结点没有总的结点个数=n1*1+n2*2+1所以:..原创 2021-11-02 14:24:48 · 3204 阅读 · 1 评论 -
排序——插入排序
1.方法:将后面的元素插入到前面有序元素中合适的位置2.开始:将第一个元素认为是有序的,从第二个元素开始向前进行比较,然后插入。如何插入:先和前一个元素的关键字进行比较,如果不符合有序,再依次向前比较,直到找到核实的位置,插入3.结束:直到最后一个元素找到了合适的位置,此时,一共走了(n-1)趟,因为除了第一个元素以外,每个元素都要在前面序列中找他的合适位置。4.时间复杂度: 最好:本身有序,但是也要走(n-1)趟,只是比较的次数是每趟只和前一个值比较1次,因此是O(n)...原创 2021-10-31 11:58:15 · 610 阅读 · 0 评论 -
0-1背包问题
讲解:【动态规划】背包问题_哔哩哔哩_bilibili* (3)算法详细描述:* (3.1)先让用户输入要测试数据的编号* (3.2)从文件中读取背包的体积,物品的价值和体积,并对物品进行封装,最后存储在list中。* (3.3)初始化一个二维数组用于存放求解过程中的结果* (3.4)调用solve函数进行求解:* 对于背包体积为0的情况和物品个数为前0个的情况,价值都为0,作为初始* 考虑要选择放入的第k个物品的体积是否大于当前背包的体积:* ...原创 2021-10-25 09:25:39 · 105 阅读 · 0 评论 -
递归调用机制
递归的重要规则:!!!(1)执行一个方法时,就会创建一个新的受保护的独立空间(栈空间)(2)方法的局部变量是独立的,不会互相影响(3)如果方法中使用的是引用类型的变量,就会共享该引用类型的数据(4)递归必须有一个退出递归的条件,向退出递归的条件逼近,否则就是无线递归(5)当一个方法执行完毕,或者遇到return,就会返回,遵守谁调用,就将结果返回给谁,同时当方法执行完毕或者返回时,该方法也就执行完毕,把空间的控制权,数据的分配权释放出来。例1:阶乘public static..原创 2021-10-31 15:58:37 · 167 阅读 · 0 评论 -
邮局选址问题——分治算法——Java实现
问题描述:在一个按照东西和南北方向划分成规整街区的城市里,n个居民点散乱地分布在不同的街区中。用x坐标表示东西向,用y坐标表示南北向。各居民点的位置可以由坐标(x,y)表示。要求:为建邮局选址,使得n个居民点到邮局之距离的总和最小。提示:带权中位数(分治算法)题目分析:(1)n个居民点散乱在街区中,是一个二维面,因此使用坐标来刻画每一个居民点;这里的权值代表的是地点的重要程度或者是价值,比如医院、商场这样人流量大且重要的地点权值要高一些;(2)不带权的中位数:就是一组有序数的中间值,原创 2021-10-16 17:18:03 · 2951 阅读 · 0 评论