经典算法
独L无二
一位颇为清高的女程序媛
展开
-
质因数分解算法C++实现
算法思想:对n进行分解质因数,应先找到一个最小的质数k,然后按下述步骤完成:(1)如果这个质数恰等于n,则说明分解质因数的过程已经结束,打印出即可。(2)如果n<>k,但n能被k整除,则应打印出k的值,并用n除以k的商,作为新的正整数你n, 重复执行第一步。(3)如果n不能被k整除,则用k+1作为k的值,重复执行第一步。#include "stdio.h"#incl...原创 2019-05-31 12:07:04 · 11300 阅读 · 0 评论 -
汉诺塔问题
题目:假设有3个柱子和一组不同大小的圆盘,柱子从圆盘的中心穿过。开始时,所有圆盘叠放在左侧第一个柱子上,目标是将所有的圆盘从第一个柱子移动到第三个柱子,同时遵守以下规则:除了被移动时,所有圆盘都必须放在柱子上。 一次只能移动一个圆盘。 圆盘不能放置在比它小的圆盘上面。递归解法:递归地将 n-1 个圆盘从第一个柱子移动到第二个柱子,而使用第三个柱子作为临时挂钩,那么最大的圆盘将独自...原创 2019-06-03 21:59:28 · 665 阅读 · 0 评论 -
深度优先搜索(DFS)C++实现
算法基本思想:深度优先搜索是尽可能深的搜索一个图,对于一个新发现的节点,如果还有以此为起点还未探测到的边,就沿此边探测下去。当顶点v的所有边都被探寻过后,搜索将回溯到发现顶点v的起始点的那些边。这一过程一直进行到一发现从原点可达的所有点为止。如果还存在未发现的顶点,则选择其中一个座位源顶点,重复上过程。递归实现void DFS_Search(ListNode* pRoot)...原创 2019-06-04 17:13:59 · 6272 阅读 · 0 评论 -
广度优先搜索(BFS)C++实现
算法思想:首先访问起始顶点v,接着由v出发,依次访问v的各个未访问过的邻接顶点w1,w2,…,wi,然后再依次访问w1,w2,…,wi的所有未被访问过的邻接顶点;再从这些访问过的顶点出发,再访问它们所有未被访问过的邻接顶点……依次类推,直到图中所有顶点都被访问过为止。广度优先搜索是一种分层的查找过程,每向前走一步可能访问一批顶点,不像深度优先搜索那样有往回退的情况,因此它不是一个递归的算法...原创 2019-06-07 20:39:49 · 8608 阅读 · 1 评论 -
判断是不是二叉查找树
题目:给定一个棵树,判断是不是二叉查找树?二叉查找树的判断条件:所有左边的结点必须小于或等于当前的结点,而当前的结点必须小于所有右边的结点。算法思路:通过自上而下传递最小和最大值来解决这个问题,在迭代遍历整个树的过程中,逐渐变窄范围来检查各个结点。以下这颗树为例:首先,从(min=INT_MIN,max=INT_MAX)这个范围开始,根结点显然落在此范围。然后处理左子...原创 2019-06-08 20:57:42 · 267 阅读 · 0 评论 -
动态规划 Vs. 贪念算法
动态规划 判断一个问题是否能用动态规划的标准:如果求解一个问题的最优解,而且该问题能够分解成若干个子问题,并且子问题之间还有重叠的更小的子问题,就可以考虑用动态规划来求解。在应用动态规划之前要先分析能否把大问题分解成小问题,分解后的每个小问题也存在最优解。如果把小问题的最优解组合起来能够得到整体的最优解,那么就可以应用动态规划来解决。 贪婪算法 贪婪算法和动态规划不一样,当应...原创 2019-07-31 12:08:41 · 105 阅读 · 0 评论 -
KMP算法
https://blog.csdn.net/v_july_v/article/details/7041827转载 2019-10-28 15:51:46 · 102 阅读 · 0 评论 -
字典树Trie
一、什么是Trie树Trie树,又叫字典树、前缀树(Prefix Tree)、单词查找树 或 键树,是一种多叉树结构。如下图:上图是一棵Trie树,表示了关键字集合{“a”, “to”, “tea”, “ted”, “ten”, “i”, “in”, “inn”} 。从上图可以归纳出Trie树的基本性质: 根节点不包含字符,除根节点外的每一个子节点都包含一个字符。 ...转载 2019-10-28 16:24:04 · 131 阅读 · 0 评论 -
KMP算法
简介 KMP 算法是 D.E.Knuth、J,H,Morris 和 V.R.Pratt 三位神人共同提出的,称之为 Knuth-Morria-Pratt 算法,简称 KMP 算法。该算法相对于 Brute-Force(暴力)算法有比较大的改进,主要是消除了主串指针的回溯,从而使算法效率有了某种程度的提高。提取加速匹配的信息 上面说道 KMP 算法主要是通过消除主串指针的回溯来提高匹配的效率的,那么,它是则呢样来消除回溯的呢?就是因为它提取并运用了加速匹配的信息! 这种信息就是对于每模式串转载 2020-08-05 17:10:59 · 205 阅读 · 0 评论 -
哈夫曼树&算法&编码
哈夫曼树哈夫曼树又称最优二叉树,是一种带权路径长度最短的二叉树。所谓树的带权路径长度,就是树中所有的叶结点的权值乘上其到根结点的路径长度(若根结点为0层,叶结点到根结点的路径长度为叶结点的层数)。树的带权路径长度记为WPL=(W1L1+W2L2+W3L3+…+WnLn),N个权值Wi(i=1,2,…n)构成一棵有N个叶结点的二叉树,相应的叶结点的路径长度为Li(i=1,2,…n)。可以证明哈夫曼树的WPL是最小的。哈夫曼算法原理: 1.为每个符号建立一个叶子节点,并加上其相应的发生频率原创 2020-08-06 09:31:23 · 3310 阅读 · 0 评论 -
回溯VS递归
很多人认为回溯和递归是一样的,其实不然。在回溯法中可以看到有递归的身影,但是两者是有区别的。回溯法从问题本身出发,寻找可能实现的所有情况。和穷举法的思想相近,不同在于穷举法是将所有的情况都列举出来以后再一一筛选,而回溯法在列举过程如果发现当前情况根本不可能存在,就停止后续的所有工作,返回上一步进行新的尝试。递归是从问题的结果出发,例如求 n!,要想知道 n!的结果,就需要知道 n*(n-1)! 的结果,而要想知道 (n-1)! 结果,就需要提前知道 (n-1)*(n-2)!。这样不断地向自己提问,不转载 2020-08-06 09:48:46 · 303 阅读 · 0 评论 -
不用中间变量交换两个变量的方法
面试中经常会出现的问题,主要针对整数类型,有两种解法:数值运算法void swap(int &A, int &B){ A = A + B; B = A - B; A = A - B;}从理解的角度来说,假如A'和B'代表交互以后的值,那么按照以上运算规则就有:A'=A+B; B'=A'-B=A+B-B=A; A'=A'-B'=A+B-A=B;最后运算的结果就变成了A'=B;B'=A;这样就完成了交换。异或运算法void swap(int &原创 2020-08-07 09:47:31 · 423 阅读 · 0 评论