程序最美(寻路)

你还在坚持练习你的技术吗?运动员天天训练,音乐家也会演练更难的曲章。你呢?

随笔分类 -  数学算法

1 2 下一页

比较好的算法网站
摘要:演算法笔记:http://www.csie.ntnu.edu.tw/~u91029/index.html 阅读全文

posted @ 2017-08-12 21:37 unixfy 阅读(539) 评论(0) 推荐(0) 编辑

Futoshiki求解
摘要:Futoshiki求解 Futoshiki是对于一个n的方阵,需要满足如下条件: ·每一行和每一列的元素都不能重复,即每一行和每一列1到n,n个数字都出现,且只出现一次。 ·同一行或同一列中相邻两个元素需要满足预先设定的一些关系,比如大于、小于等等。 例如,有以下样例: 这是一个5的方阵,方阵中元素为0的元素表示该元素为空,即还没有放置1-n中的某个数字。初始方阵中有些元素已经被放置了,这些元素不能被修改。同一行的元素被|字符间隔,同时也有关系符,来规定相邻两个元素的关系。同样,同一列的元素被-字符间隔,同时^和v字符用来规定相邻两个元素间的关系。 对应于上面的初始方阵,有 阅读全文

posted @ 2014-01-13 23:59 unixfy 阅读(1181) 评论(0) 推荐(0) 编辑

约束条件下的优化问题
摘要:约束条件下的优化问题 给定一系列训练,每个训练有以下几个属性:名字能量消耗可以被选的阶段个数阶段1阶段2…… 有x个阶段,每个阶段又有如下以下两个限制: 1.每个阶段中最多不能包含超过n个训练,也就是说训练个数小于等于n; 2.每个阶段里的能量消耗总和不得大于m。 在这种约束条件下,求得所有阶段能耗消耗总和最大的组合。每个训练最多可以被选择一次,可以不被选择。 这个问题咋一看有点类似于背包问题,每个训练最多可以被选择一个,有点像是01背包问题,并且也有限制条件,比如每个阶段不得大于n个训练,能耗之和不得大于m,但最终也想求得所有阶段能耗最大的组合。 背包问题有很多种,诸如01背包、完全背包、多 阅读全文

posted @ 2013-12-26 00:38 unixfy 阅读(3336) 评论(0) 推荐(0) 编辑

家谱树的建立和求解最大路径
摘要:家谱树的建立和求解最大路径 家谱树也称为家谱图,用来标识家族中人员的关系等。 给定一个家谱树文件,文件格式是: 1.第一行是一个整型的数n,表示这个家谱树中成员的个数。 2.后面紧跟着n行数据,每行代表一个成员,其格式为:名字姓性别年龄 由四部分信息组成,其中性别M表示男性,F表示女性。 3.后面继续跟m行数据,m未知,用来表示成员间的父母-孩子关系,其格式为:孩子名孩子姓父亲名父亲姓母亲名母亲姓 我们要做的工作是: 1.设计合理的数据结构,用来保存每个成员、成员间的关系,以及整个家谱树。 2.根据指定的性别,找到在家谱树中性别都为该性别的最长路径。 3.求解家谱树中年龄之和最大的路径。 比如 阅读全文

posted @ 2013-12-26 00:32 unixfy 阅读(1615) 评论(0) 推荐(0) 编辑

图的建立、广度优先遍历和深度优先遍历
摘要:图的建立、广度优先遍历和深度优先遍历 图分为有向图和无向图,再根据是否有权重又可以分为有权重图和无权重图。图常用的表示方式有邻接矩阵和邻接表。这里我们处理的图是有向、无权重图,采用的表示方式是邻接表。 图的数据保存在文件中,比如: a 1 b b 2 c e c 1 f d 2 c f e 1 a f 0 其中,第一个元素表示图中节点的名字,第二元素表示其可以直接到达的节点个数,后面紧跟着直接可以达到的节点。 我们采用的表示方式是邻接表,邻接表首先针对图中的节点定义一个数组,用来记录每个节点,数组中的每个节点元素后面跟着一个链表,在该链表中记录着其可以直接到达的节点。 节点的定义有以下几个部分 阅读全文

posted @ 2013-12-22 17:11 unixfy 阅读(10730) 评论(0) 推荐(0) 编辑

多叉树的设计、建立、层次优先遍历和深度优先遍历
摘要:多叉树的设计、建立、层次优先遍历和深度优先遍历 早起曾实现过一个简单的多叉树《实现一个多叉树》。其实现原理是多叉树中的节点有两个域,分别表示节点名以及一个数组,该数组存储其子节点的地址。实现了一个多叉树建立函数,用于输入格式为A B。A表示节点的名字,B表示节点的子节点个数。建立函数根据用户的输入,首先建立一个新的节点,然后根据B的值进行深度递归调用。用户输入节点的顺序就是按照深度递归的顺序。另外,我们实现了一个层次优先遍历函数。该函数用一个队列实现该多叉树的层次优先遍历。首先将根节点入队列,然后检测队列是否为空,如果不为空,将队列出队列,访问出队列的节点,然后将该节点的子节点指针入队列,依次 阅读全文

posted @ 2013-12-22 17:06 unixfy 阅读(43096) 评论(3) 推荐(5) 编辑

几个简单的排序算法及其优化
摘要:几个简单的排序算法及其优化 排序算法是数据结构、算法中的基本组成部分,TAOCP中专门有一卷是讲排序算法的。网上有个排序算法的介绍和博客很多,可以自行谷歌百度之。相关基本介绍可以查看Wiki。 这里我们简单介绍几个简单的排序算法:冒泡排序、选择排序、插入排序、快速排序。其中,我们分别对冒泡排序、选择排序、插入排序做了小小的优化,快速排序算法我们采用的分割策略是《快速排序的三种分割策略》中介绍的第三种分割策略。 冒泡排序的原理是始终比较两个相邻的元素,如果符合条件就交换。其改进方法是,添加一个标示符,初始的时候用来表示待排序序列时已经有序的,如果存在交换操作,则说明原来序列不是有序的,修改该标示 阅读全文

posted @ 2013-12-22 16:59 unixfy 阅读(1372) 评论(0) 推荐(0) 编辑

快速排序专辑
摘要:快速排序专辑 有关快速排序的几篇博文:题目网址重谈快速排序链接快速排序的三种分割策略链接基于快速排序的快速选择链接 有关内容持续更新中…… 阅读全文

posted @ 2013-12-19 23:42 unixfy 阅读(234) 评论(0) 推荐(0) 编辑

基于快速排序的快速选择
摘要:基于快速排序的快速选择 ——《数据结构与算法分析——C语言描述》 快速选择有很多方法,这里不做一一介绍。《重谈快速排序》中我们介绍了快速排序的相关实现细节。这里我们介绍一种基于快速排序的快速选择方法。 其实现原理和快速排序类似。 给出一个序列,我们不知道该序列是否已经排好序,如果我们想从中选择第k小的数,该怎么做?最简单最直观的方法是对这个序列进行排序,然后依据k选择索引为k-1数即可。由于排序的时间复杂度为O(NlogN)。所有这种选择第k小的数的时间复杂度是O(NlogN)。 这样会造成一定的浪费,因为我们仅仅是想从中选择第k个小的数,而对序列进行排序导致前k-1个数和后面的n-k个数都是 阅读全文

posted @ 2013-12-19 23:25 unixfy 阅读(718) 评论(0) 推荐(0) 编辑

快速排序的三种分割策略
摘要:快速排序的三种分割策略 在前面《重谈快速排序》中,我们提到快速排序有两个关键点,分别是:1.枢纽元的选择;2.选定枢纽元后,如何对序列进行左右分割。枢纽元的选择有好几种方法,比如:选择第一个元素作为枢纽元,或者选择中间一个元素,抑或选择最后一个元素,怎么选都可以,也可以随机选择一个元素作为枢纽元。由于快速排序特点,如果枢纽元选择不当,其时间复杂度有可能变为O(N*N)。所以即便是采用伪随机的方式随机选择一个元素作为枢纽元,也有可能选择不当。另外,随机选择需要一定的消耗。除此之外,为了避免一次随机造成的不良影响,可以随机多次进行选择,比如随机选取其中三个元素,选择这三个元素中的中位数作为枢纽元。 阅读全文

posted @ 2013-12-19 23:16 unixfy 阅读(1898) 评论(0) 推荐(0) 编辑

重谈快速排序
摘要:重谈快速排序 ——《数据结构与算法分析——C语言描述》 快速排序是最为常见的排序算法之一。谷歌、百度“快速排序”,会有很多快速排序的讲解和代码实现。但是这么多实现中,真正好的实现并不多见,快速排序思想很简单,但是实现起来有很多细节需要注意,稍不留意,就会出现错误或者效率降低。 快速排序有如下两个关键点: 1.枢纽元的选择 2.选定了枢纽元后,如何进行左右分割 这两点都会直接影响快速排序的效率,尤其是第二点,如果有些细节实现没有考虑清楚,会导致效率降低,甚至出现死循环。 选定了枢纽元后,进行左右分割有很多方法,只要最后分割的左右两部分元素满足小于或大于枢纽元即可。 常见的方法有挖坑填数法,具体实 阅读全文

posted @ 2013-12-18 00:52 unixfy 阅读(543) 评论(0) 推荐(0) 编辑

通过赔率预测比赛
摘要:通过赔率预测比赛 根据历往博彩公司开的赔率以及每次比赛的胜负,运用分类算法(本质上是二元分类,因为只是针对胜负)进行未来比赛的预测。得到的结果并不算很理想。主场情况下,最好只能达到七成的准确率,客场更差,对于二串一的玩法这种准确率无法胜任。 采用的分类算法是KNN,KNN的实现也可以详见之前的C++Blog上的博文,特征向量间距离是采用欧氏距离,特征向量间距离和相似度的计算可以详见C++Blog博文。 发表一下个人对于基于统计学习方法的看法:机器学习或者基于统计的方法是没有办法的办法,无法通过规则得到良好的结果,所以只能依赖于历史数据,经过大规模运算得到一个看上去还可以的结果。这种看上去还可以 阅读全文

posted @ 2013-12-16 14:17 unixfy 阅读(999) 评论(0) 推荐(0) 编辑

再议并查集
摘要:再议并查集 上文《并查集》中,我们讨论了并查集的数据结构和基本操作,以及给出了个基本实现。我们指出理解并运用好并查集重点在于理解元素的表示、类别的表示、元素的索引,以及三者之间的关系。 在实现中,我们指出Find的参数x是为data的索引(等价于father的索引),用索引表示实际的元素,并Find出其类别。这里我们补充一点:Find函数返回的是参数x对应的类别,这里的类别表示依然是用data的索引进行的表示,返回的索引(返回值)实质上是所述类别的祖先节点的索引。 同样Union函数的两个参数实质是data的索引(等价于father的索引),但表示的是其对应的元素所述的类别。在Union中,i 阅读全文

posted @ 2013-10-11 20:11 unixfy 阅读(237) 评论(0) 推荐(0) 编辑

并查集
摘要:并查集 并查集是一种简单且强大的工具。本文我们就是学习并介绍一下并查集。并查集的资料网上有很多,也有很多代码实现。博主在学习的过程中也查阅了很多资料,有兴趣的话可以Google之。 并查集有三个数据结构: 集合:实际元素组成的集合 类信息:记录元素的类信息 秩信息:记录元素的高度 并查集包含三种基本操作: Init:初始化,将集合每个元素看做一个类别,元素的类信息即为自身,秩信息都为0 Find:查找,根据给定的元素,返回其类别信息。在执行查找的过程中进行路径压缩优化,以提高后续Find的效率。 Union:合并,将两个元素所在的集合进行合并(集合用其中的元素来表示),在合并的过程中同样进行优 阅读全文

posted @ 2013-10-11 16:40 unixfy 阅读(356) 评论(0) 推荐(0) 编辑

输出有序序列中元素的排名
摘要:输出有序序列中元素的排名 给定一个有序序列,假设为:1, 2, 2, 8, 9, 9, 10 我们想得到各个元素在序列中的排名,比如1的排名为1,第一个2和第二个2的排名都为2,即我们想得到这样一个序列:1, 2, 2, 4, 5, 5, 7 我们首先讨论根据一个有序序列,如何得到其各个元素的排名;然后,讨论针对某个元素,如何快速得得到其排名。 一、得到整个序列各个元素的排名 程序如下:#include #include using namespace std;// 检测是否有序bool is_ordered(const vector& arr){ for (vector::size_ 阅读全文

posted @ 2013-07-10 15:28 unixfy 阅读(414) 评论(0) 推荐(0) 编辑

递归的讨论
摘要:递归的讨论 递归是一个强大的工具,用递归写的程序往往比较容易理解和实现。但是当面对一些递归性问题的时候,我们的第一感觉就是用递归程序实现,但是从问题到最终的实现程序之间需要经过什么?怎样才能写出正确的递归程序?我们将在这里进行关于递归的讨论。 我们首先介绍两个简单的递归实现程序,然后讨论循环与递归的关系,再结合之前递归程序,讨论如何才能写出正确的递归程序。一、两个简单的递归程序这里我们讨论阶乘的计算和斐波那契数列的计算。首先我们给出这两个的非递归实现:// 阶乘与斐波那契数列的非递归实现#include using namespace std;int fact(int n){ if (n... 阅读全文

posted @ 2013-06-29 02:34 unixfy 阅读(244) 评论(0) 推荐(0) 编辑

组合序列、排列序列的生成实现
摘要:组合序列、排列序列的生成实现 前面我们已经讨论了关于组合数、排列数的生成《排列、组合的计算》,并没有涉及组合序列和排列序列是如何生成的。这里我们将讨论序列和排列序列是如何生成的,首先我们讨论组合序列。一、组合序列假如有如下集合(注意,集合中的元素是互异的):0, 1, 2, 3, 4, 5, 6, 7, 8, 9 我们从该集合中选取3个元素,问有多少种组合,这些组合具体是什么? 首先,我们给出程序如下:// 组合序列的生成#include #include using namespace std;void comb(const vector& arr, int beg, int m, 阅读全文

posted @ 2013-06-28 22:53 unixfy 阅读(874) 评论(0) 推荐(0) 编辑

摘要:堆 本文我们重点讨论堆,堆分为最小堆和最大堆两种,由于两者操作操作类似,所以我们只讨论最小堆(在实现的过程中我们定义了compare函数,可以同时适用于最小堆和最大堆)。 最小堆的定义如下:A[i] #include using namespace std;typedef bool (*cmp_fun)(int a, int b);void display(const vector& arr){ for (vector::size_type i = 0; i != arr.size(); ++i) { cout b;}bool exchange(int& a, in... 阅读全文

posted @ 2013-06-27 00:54 unixfy 阅读(572) 评论(0) 推荐(0) 编辑

二分查找细则讨论
摘要:二分查找细则讨论 二分查找有两种实现方式:非递归和递归。我们首先给出非递归的实现,然后对其中的细则进行讨论。之后,我们再讨论递归实现的细则。一、非递归实现 这里我们假设待查找序列是有序且互异的。#include #include using namespace std;void nonrec_binary(const vector& arr, int n, int& pos){ pos = -1; assert(arr.size() > 0); int left = 0, right = arr.size() - 1, middle = 0; while (left .. 阅读全文

posted @ 2013-06-23 18:54 unixfy 阅读(243) 评论(0) 推荐(0) 编辑

从每组中依次选择一个元素
摘要:从每组中依次选择一个元素 假设有N组元素,从N组中依次选取一个元素组成一个序列。假如N组元素的个数依次为A1,A2,…,AN,那么得到的序列数应该为A1*A2*…*AN。 下面我们关注的是如何生成A1*A2*…*AN个序列。由于N是个变量,如果是用N个循环实现,只能针对特定的N个组的情况。并且如果N很大时,实现起来不现实。 这里我们采用递归的方法来实现。// 递归实现#include #include #include using namespace std;void foo(const vector >& src, int x, int n, int& total, v 阅读全文

posted @ 2013-06-23 02:18 unixfy 阅读(343) 评论(0) 推荐(0) 编辑

1 2 下一页

导航

点击右上角即可分享
微信分享提示