
算法与数据结构
文章平均质量分 65
卡尔曼和玻尔兹曼谁曼
面朝大海,春暖花开
展开
-
Dijkstra算法及其C++实现
Dijkstra算法及其C++实现什么是最短路径问题如果从图中某一顶点(称为源点)到达另一顶点(称为终点)的路径可能不止一条,如何找到一条路径使得沿此路径上各边上的权值总和达到最小。单源最短路径问题是指对于给定的图G=(V,E)G=(V, E)G=(V,E),求源点v0v_0v0到其它顶点vtv_tvt的最短路径。Dijkstra算法Dijkstra算法用于计算一个节点到其他节点的最短路径。Dijkstra是一种按路径长度递增的顺序逐步产生最短路径的方法,是一种贪婪算法。Dijkstra算法原创 2020-08-19 20:53:07 · 6098 阅读 · 1 评论 -
从傅立叶级数到傅立叶变换
版权声明:本文为博主原创文章,转载请注明原文出处!写作时间:2019-10-31文章目录傅立叶级数傅立叶变换写这篇博文的初衷是在翻阅数字图像处理相关教科书的时候,发现大部分对傅立叶变换的讲解直接给出了变换公式,而对于公式从何而来并没有给出说明。所以,本文在假设已经了解傅立叶级数的背景下,从傅立叶级数推导出傅立叶变换的一般公式。傅立叶级数学过高数的童鞋都听过傅立叶级数,下面直接给出定义...原创 2019-10-31 20:37:16 · 1157 阅读 · 0 评论 -
回溯法:八皇后问题
八皇后问题是一个以国际象棋为背景的问题:如何能够在 8×8 的国际象棋棋盘上放置八个皇后,使得任何一个皇后都无法直接吃掉其他的皇后?为了达到此目的,任两个皇后都不能处于同一条横行、纵行或斜线上。八皇后问题可以推广为更一般的n皇后摆放问题:这时棋盘的大小变为n×n,而皇后个数也变成n。当且仅当 n = 1 或 n ≥ 4 时问题有解。这个问题简化描述就是:在8x8的棋盘上放8颗子,要求它们【不在同一行原创 2015-05-17 12:24:51 · 7926 阅读 · 1 评论 -
动态规划:数塔问题
动态规划问题我训练过一些题目,但是感觉自己掌握的还不是特别好! 下面以一道经典的动态规划题目说明动态规划算法的思想,文末会官方的给出对动态规划的文字叙述。先看题目:如下图(图片来自百度图片)是一个数塔,从顶部出发在每一个节点可以选择向左或者向右走,一直走到底层,要求找出一条路径,使得路径上的数字之和最大.思路分析: 这道题目如果使用贪婪算法不能保证找到真正的最大和。 在用动态规划考虑数塔问题时原创 2015-05-17 23:35:59 · 62216 阅读 · 8 评论 -
快速排序算法
快速排序算法的基本思想是通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。我们来看看一趟排序中如何将数据划分为两部分,使得左边部分比给定元素小,而右边部分比给定元素大。 首先,我们选定一个数字作为中轴元素用于划分数据,我们选择数据的第一个元素。 然原创 2017-05-10 17:56:50 · 1032 阅读 · 0 评论 -
冒泡排序
冒泡排序应该算是最简单的排序算法了,其过程如下: 1. 比较相邻的元素。如果第一个比第二个大,就交换他们两个。 2. 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对。在这一点,最后的元素应该会是最大的数。 3. 针对所有的元素重复以上的步骤,除了最后一个。 4. 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。Java版本实现:public class So原创 2017-05-10 21:50:34 · 714 阅读 · 0 评论 -
直接插入排序
插入排序就是每一步都将一个待排数据按其大小插入到已经排序的数据中的适当位置,直到全部插入完毕。经典的插入排序算法有直接插入排序和希尔排序。 直接插入排序的基本思想是:将一个记录插入到已排序好的有序表中,从而得到一个新,记录数增1的有序表。即:先将序列的第1个记录看成是一个有序的子序列,然后从第2个记录逐个进行插入,直至整个序列有序为止。 图示如下(自百度图片,若有侵权,请告知): Java代码原创 2017-05-11 15:34:42 · 600 阅读 · 0 评论 -
希尔排序
希尔排序是对直接插入排序的改进,其实质就是分组插入排序,该方法又称缩小增量排序。 该算法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的一系列元素组成)分别进行直接插入排序,然后依次缩减增量再进行排序,直到增量为1(即对全体数据元素进行一次直接插入排序)。 希尔排序是按照不同步长对元素进行插入排序,当刚开始元素很无序的时候,步长最大,所以插入排序的元素个数很少,速度很快原创 2017-05-11 17:12:13 · 592 阅读 · 0 评论 -
直接选择排序
选择排序是一种简单直观的排序算法。其基本思想是每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法。经典的选择排序算法有:直接选择排序和堆排序。下面是直接选择排序的Java实现:// 交换数组中的两个元素public static void swap(int[] numbers, int i, int j) {原创 2017-05-11 17:57:36 · 648 阅读 · 0 评论 -
堆排序
堆排序采用的数据结构是完全二叉树,所以在介绍堆排序之前,我们先看看完全二叉树的定义及性质。定义一:只有最下面的两层结点度能够小于 22,并且最下面一层的结点都集中在该层最左边的若干位置的二叉树。定义二:若设二叉树的深度为 hh,除第 hh 层外,其它各层 (1~h−1)(1~h-1) 的结点数都达到最大个数,hh 层所有的结点都连续集中在最左边,这就是完全二叉树。 完全二叉树是由满二叉树而引出来的原创 2017-05-11 21:34:18 · 742 阅读 · 0 评论 -
归并排序
归并排序采用分而治之(divide and conquer)的思想,通过将已经排好序的子序列合并,得到最终完全有序的序列。所以归并算法包括两大步骤:第一步是“分割”,第二步是“合并”,即先对原始序列进行分割排序,使每个子序列有序,然后再通过合并使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。二路归并的过程大致如下:归并过程为:比较a[i]和b[j]的大小,若a[i]≤b[j],则将第原创 2017-05-25 14:24:39 · 741 阅读 · 0 评论 -
基数排序
基数排序(Radix sort)是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。比较官方地说,基数排序是一种基于多关键字的排序。基数排序具体过程如下: 将所有待比较数值(正整数)统一为同样的数位长度,数位较短的数前面补零。 然后,从最低位开始,依次进行一次排序。这个排序并非比较大小,而是将对应的数字放置在其对应的桶中。即个位数字是0的数字放置在索引为0的原创 2017-05-25 19:54:30 · 794 阅读 · 0 评论 -
常见排序算法
注:点进链接查看算法具体实现!!!插入排序直接插入排序希尔排序交换排序冒泡排序快速排序选择排序直接选择排序堆排序归并排序基数排序总结 注:图片来自网络,侵权删!原创 2017-05-11 17:25:58 · 525 阅读 · 0 评论 -
交叉熵
上一篇译文《香农熵》中介绍了熵的由来及其计算公式的产生,这篇译文介绍另外一个与香农熵相关的概念:交叉熵(Cross-Entropy)注:可能文中对一些专有名词的翻译不够精确,所以有的名词后面注解了其对应的原始英文单词原文:A Friendly Introduction to Cross-Entropy Loss简介(Introduction)当我们要建立一个基于概率论的分类模型...翻译 2018-04-12 03:15:59 · 1605 阅读 · 0 评论 -
Min Cost Climbing Stairs
Min Cost Climbing Stairs题目On a staircase, the i-th step has some non-negative cost cost[i] assigned (0 indexed).Once you pay the cost, you can either climb one or two steps. You need to find m...原创 2018-09-04 09:25:19 · 381 阅读 · 0 评论 -
五大常用算法之二:动态规划算法
一、基本概念 动态规划过程是:每次决策依赖于当前状态,又随即引起状态的转移。一个决策序列就是在变化的状态中产生出来的,所以,这种多阶段最优化决策解决问题的过程就称为动态规划。二、基本思想与策略 基本思想与分治法类似,也是将待求解的问题分解为若干个子问题(阶段),按顺序求解子阶段,前一子问题的解,为后一子问题的求解提供了有用的信息。在求解任一子问题时,列出各种可能的局部解,通转载 2015-03-30 15:48:09 · 6298 阅读 · 0 评论 -
树和二叉树的转换
树和二叉树是两种不同的数据结构,树实现起来比较麻烦,但是树可以转换为二叉树进行处理,处理完以后再从二叉树还原为树。 下面说说转换的方法: 1. 树转换为二叉树 (1) 树中所有相同双亲结点的兄弟结点之间加一条连线。 (2) 对树中不是双亲结点第一个孩子的结点,只保留新添加的该结点与左兄弟结点之间的连线,删去该结点与双亲结点之间的连线。 (3) 整理所有保留的和添加的连线,使每个结点的第一个原创 2015-03-12 20:23:35 · 9071 阅读 · 0 评论 -
二叉树的初始化
问题:给定二叉树的初始化数据,怎样动态建立一个二叉树呢?比如我们给定这样的一组数据:{ 1, 2, 3, 4, 0, 5, 6, 0, 7 }(假设0代表空),则我们构建的二叉树是这样的: 1 / \ 2 3 / / \ 4 5 6 \ 7思路分析:我们可以使用一个队列,队首出一个元素,队未进两个元素,而这两个元素正原创 2015-03-12 16:26:52 · 28685 阅读 · 2 评论 -
字符的全排列
昨天又同学要去面试问到我关于字符全排列的原创 2014-09-16 08:33:24 · 1051 阅读 · 0 评论 -
二叉树的遍历以及遇到的一些问题
今天在学习二叉树的遍历,原创 2014-10-22 22:26:56 · 6050 阅读 · 0 评论 -
排序(二):希尔排序
希尔排序也属于插入排序。希尔排序的基本思想是:把待排序的数据元素分成若干个小组,对同一小组内的数据元素用直接插入法排序;小组的个数逐次缩小;当完成了所有数据元素都在同一个组内的排序后排序过程结束。希尔排序又称作缩小增量排序。希尔排序是在分组概念上的直接插入排序,即在不断缩小组的个数时把原来各小组的数据元素插入到新组的合适位置上。希尔排序是一种不稳定的排序算法。原创 2014-11-07 16:34:33 · 829 阅读 · 0 评论 -
非常好的理解遗传算法的例子
遗传算法的手工模拟计算示例为更好地理解遗传算法的运算过程,下面用手工计算来简单地模拟遗传算法的各 个主要执行步骤。 例:求下述二元函数的最大值: (1) 个体编码 遗传算法的运算对象是表示个体的符号串,所以必须把变量 x1, x2 编码为一种 符号串。本题中,用无符号二进制整数来表示。转载 2014-11-07 22:21:32 · 1924 阅读 · 0 评论 -
排序(三):直接选择排序
选择排序的基本思想是:每次从待排序的数据元素集合中选取关键字最小(或最大)的数据元素放到数据元素集合的最前(或最后),数据元素集合不断缩小,当数据元素结合为空的时候选择排序结束。常用的选择排序有直接选择排序和堆排序两种。堆排序是一种基于完全二叉树的排序。直接选择排序的基本思想是:从待排序的数据元素集合中选取关键字最小的数据元素并将它与原始数据元素集合中的第一个数据元素交换位置;然后从不包括原创 2014-11-08 18:53:58 · 899 阅读 · 0 评论 -
排序(四):堆排序
在直接选择排序中,待排序的数据元素集合构成一个线性表结构,要从有n个数据元素的线性表中选择出一个最小的数据元素需要比较n-1次。如果能把待排序的数据元素集合构成一个完全二叉树结构,则每次选择出一个最大(或最小)的数据元素只需比较完全二叉树的高度次,即lb(n)次。这就是堆排序的基本思想。对于具有n个结点的完全二叉树,如果按照从上到下和从左到右的顺序对所有结点从0开始顺序编号,则对于序号为i原创 2014-11-09 22:12:31 · 969 阅读 · 0 评论 -
排序(一):直接插入排序
插入排序插入排序的基本思想是:从初始有序的子集合开始,不断地把新的数据元素插入到一排列有序子集合的合适位置上,使子集合中数据元素的个数不断增多,当子集合等于集合时,插入排序算法结束。常用的插入排序有直接插入排序和希尔排序两种。直接插入排序直接插入排序的基本思想是:顺序地把待排序的数据元素按其关键字值的大小插入到已排序数据元素子集合的适当位置。子集合的数据元素个数从只有一个数据元素开原创 2014-11-06 10:50:52 · 1330 阅读 · 0 评论 -
Mahout协同过滤推荐
协同过滤 —— CollaborativeFiltering协同过滤简单来说就是根据目标用户的行为特征,为他发现一个兴趣相投、拥有共同经验的群体,然后根据群体的喜好来为目标用户过滤可能感兴趣的内容。协同过滤推荐—— Collaborative FilteringRecommend协同过滤推荐是基于一组喜好相同的用户进行推荐。它是基于这样的一种假设:为一用户找到他转载 2014-11-10 10:14:21 · 1553 阅读 · 0 评论 -
排序(五):冒泡排序
利用交换数据元素的位置进行排序的方法称为交换排序。常用的交换排序方法有冒泡排序法和快速排序法。快速排序法是一种分区交换排序方法。冒泡排序的基本概念是:依次比较相邻的两个数,将小数放在前面,大数放在后面。即首先比较第1个和第2个数,将小数放前,大数放后。然后比较第2个数和第3个数,将小数放前,大数放后,如此继续,直至比较最后两个数,将小数放前,大数放后。第一趟完成,最大的数被放置在最原创 2014-11-30 20:52:22 · 1113 阅读 · 0 评论 -
为什么最大值加一等于最小值
在程序中有时候不小心将最大数值加1,我们会得到一个负数,这个负数就是这种数据类型的最小值。下面看一个示例:public class Number { public static void main(String[] args) { System.out.println("最大的整数:" + Integer.MAX_VALUE); System.out.println("最大的原创 2015-02-04 21:20:23 · 4903 阅读 · 1 评论 -
源码、反码、补码详解
本篇文章讲解了计算机的原码, 反码和补码. 并且进行了深入探求了为何要使用反码和补码, 以及更进一步的论证了为何可以用反码, 补码的加法计算原码的减法. 论证部分如有不对的地方请各位牛人帮忙指正! 希望本文对大家学习计算机基础有所帮助! 一. 机器数和真值在学习原码, 反码和补码之前, 需要先了解机器数和真值的概念.1、机器数一个数在计算机中的二进制表示形式, 叫做这个数的机转载 2015-01-17 15:44:37 · 1347 阅读 · 0 评论 -
计算器:中缀表达式转后缀表达式
这几天想写一个Android的计算器,所以先写好中缀表达式到后缀表达式的计算。例如:中缀表达式(8+9*10)-4/2+3我们可以进行如下操作:1、将每个操作符对应的两个操作数用括号括上(((8+(9*10))-(4/2))+3)2、将操作符移到对应的括号外(((8(910*)+)(42)/)-3)+3、去掉括号即可 8910*+42/-3+那么计算机中是怎样进行的呢原创 2015-02-10 20:21:02 · 3585 阅读 · 0 评论 -
建造者模式
建造者模式(Builder Pattern)使用多个简单的对象一步一步构建成一个复杂的对象。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。首先来看建造者模式的UML图:Ibuilder:给出一个抽象接口,以规范产品对象的各个组成成分的建造。这个接口规定要实现复杂对象的哪些部分的创建,并不涉及具体的对象部件的创建。Builder:实现IBuilder接口,针对不同的商原创 2015-01-23 23:54:35 · 925 阅读 · 0 评论 -
KMP算法(二)
总结一下: KMP算法的思想是:设s为主串,t为模式串设i为主串s当前比较字符的位置,j为模式串t当前比较字符串的位置,令i和j的初值0。当si=tj时,i和j分别增加1然后继续比较;否则i不变,j改变为等于next[j]再继续比较。以此类推,直到下列两种情况之一:(1)j退回到某个j=next[j]时有si=tj,则i和j分别增加1再继续比较;(2)j退回j=-1,此时令主串和模式串的位置各增1原创 2015-03-16 21:32:39 · 828 阅读 · 0 评论 -
约瑟夫环问题
以前写的程序,今天在整理文件的时候发现了,贴出来有需要的朋友可以参考!问题提出:约瑟夫环是一个数学的应用问题:已知n个人(以编号0,2,3...n-1分别表示)围坐在一张圆桌周围。从编号为k的人开始报数,数到m的那个人出列;他的下一个人又从1开始报数,数到m的那个人又出列;依此规律重复下去,直到圆桌周围的人全部出列。解决方案:约瑟夫环有递归和非递归两种解决方案。1. 非递归原创 2014-03-25 20:20:18 · 1249 阅读 · 0 评论