算法
零一熊
这个作者很懒,什么都没留下…
展开
-
堆排序
先将数组构造成堆有序的数组即数组对应的完全二叉树所有根节点大于其孩子节点再将堆有序的数组转化为非递减数组 private void buildMaxHeap(int[] nums){ int heapSize = nums.length; for(int i = heapSize / 2; i >= 0; i--){ sink(nums, i, heapSize); } int N = nums.length原创 2021-05-04 19:36:52 · 41 阅读 · 0 评论 -
DFS深度优先搜索
DFS的主要思想DFS深度优先搜索通过不断递归向后深入,当出现当前情况不满足条件或不是最优情况时回到上一步继续向后递归,最终遍历所有元素。DFS的实现DFS主要通过递归来实现,即1.递归的定义 创建DFS函数2.递归的拆解 通常在一个for循环中 进行条件判断 元素的添加 DFS递归 元素的删除3.递归的出口 即当已找到符合条件的组合 进行回溯DFS的应用以上题目已用java实现总结DFS由于会对每个元素的每种可能都进行递归遍历,所以通常用来找所有可能的方案与组合,少数情况用于找最优解原创 2021-04-19 09:28:28 · 68 阅读 · 0 评论 -
BFS宽度/广度优先搜索
BFS的主要思想BFS是一种按层遍历的策略,即从初始节点不断向距离更远的节点遍历。即优先遍历距离近的该层节点,再遍历距离较远的下一层所有节点。BFS的实现BFS通常用队列进行实现,首先将起始节点加入到队列中,当队列不为空时进行while循环,每一轮循环先取出一个队列元素,将该元素的下一层元素都添加到队列中。队列的先进先出特性保证了每一次出队列的元素都是队列中距离起始节点较近的一层的元素。BFS的应用具体题目代码已用java实现。总结BFS在不同问题中的实现主体基本相同,都是通过队列实现了对较原创 2021-04-17 08:08:03 · 71 阅读 · 0 评论 -
分治法与二叉树
分治法主要思想:将一个复杂问题分成若干个相同或相似的子问题递归求解,最后将子问题的解合并divide-conquer对应题目已用java实现分治法主要利用递归来实现,分治法和递归都是DFS深度优先搜索的思想。分治法的主体递归主要考虑三个过程:1.递归的定义 即创建一个递归函数 考虑具体需要的返回值以及形参2.递归的拆解 即将复杂问题拆成若干的子问题 在二叉树中即为用左右子树分别调用递归函数 然后对子问题的解进行合并 从局部解不断归并得到整体解3.递归的出口 即当问题拆解到足够小可以解决的问原创 2021-04-15 17:17:16 · 269 阅读 · 0 评论 -
字符串匹配算法----KMP算法,Boyer-Moore算法和Rabin-Karp算法
KMP算法target(查找子串) source(待匹配子串)KMP算法是在原有的暴力逐个比较算法上进行的改进,即从target的第一个字符与source的第一个字符进行比较,若两个字符相等则逐个向后比较,当出现不相等字符时,target回到第一个字符,source向后移动一个字符重复之前的步骤。KMP算法主要思想是当出现比较不相等的情况时,对target的回溯位置(新的进行比较的字符)进行优化,以减少不必要的比较。例如:source = abcabcabetarget = abcabe前五个字原创 2021-04-10 18:28:14 · 350 阅读 · 0 评论 -
排序
排序void swap(SqList *L, int i, int j){ int temp = L->r[i]; L->r[i] = L->r[j]; L->r[j] = temp;}冒泡排序void BubbleSort(SqList *L){ int i, j; Status flag = TRUE; //用来标记,若在一次循环中未出现元素交换, //则不需要进行下一次循环 for(i = 1; i< L->length &原创 2021-04-05 21:37:46 · 51 阅读 · 0 评论 -
查找
查找顺序表查找(设置哨兵)int Sequential_Search2(int *a, int n, int key){ int i; a[0] = key; i = n; while(a[i] != key){ i--; } return i;}二分法查找public int lastOrFirstPositon(int[] nums, int target){ if(nums == null || nums.length == 0){ return原创 2021-04-05 09:55:03 · 66 阅读 · 0 评论