程序最美(寻路)

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

12 2013 档案

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

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

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

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

结构体的赋值
摘要:结构体的赋值 1.指针的赋值 区分对指针本身赋值和对指针指向的空间进行赋值。 2.数组的赋值 不能对数组名进行赋值,对数组的赋值实质上是数组中元素一个一个的拷贝。 3.结构体的赋值 结构体中的指针 结构体中含有指针时,对结构体赋值类似于指针的赋值,只是浅赋值,如果想深赋值,还需要额外处理。 结构体中的数组 结构体含有数组时,对结构体进行赋值,可以实现数组的直接赋值,而外部的数组不能进行直接赋值,而是一个一个的拷贝。 结构体的直接赋值,实质上是对结构体的完全拷贝,不管结构体中有指针还是数组,拷贝的内容都是结构体本身,也就是说结构体中有指针时,拷贝的是指针本身;结构体中有数组时,拷贝的是数组。 对 阅读全文

posted @ 2013-12-24 20:22 unixfy 阅读(9319) 评论(0) 推荐(1) 编辑

图的建立、广度优先遍历和深度优先遍历
摘要:图的建立、广度优先遍历和深度优先遍历 图分为有向图和无向图,再根据是否有权重又可以分为有权重图和无权重图。图常用的表示方式有邻接矩阵和邻接表。这里我们处理的图是有向、无权重图,采用的表示方式是邻接表。 图的数据保存在文件中,比如: 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 阅读(10729) 评论(0) 推荐(0) 编辑

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

posted @ 2013-12-22 17:06 unixfy 阅读(43094) 评论(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) 编辑

利率的计算
摘要:利率的计算 假设一段时间Y内的利率为IR,这段时间可以划分为DS个时间片,每个时间片的利率DIR=IR/DS。本金为P,计算一段时间Y后的本金+利息和:P1=P(1+IR)P2=P(1+DIR)^DSP3=P(1+IR)(1+IR) 其中,P1必定小于P2。比较P2和P3的大小关系即是比较(1+DIR)^DS和(1+IR)^2的大小关系。这取决于DIR、DS、IR,本质上是DS、IR。 假设IR=5%,DS=365,P=1000,计算P1和P2的值。#include using namespace std;double PrincipalAndInterest(double pricipal, 阅读全文

posted @ 2013-12-12 00:40 unixfy 阅读(245) 评论(0) 推荐(0) 编辑

区间划分操作
摘要:区间划分操作 输入几个区间,根据已知区间的边界,划分成更小的区间,比如有区间:[1,1] [2,2] [3,8] [5,7] [7,9] 我们希望重新划分得到的结果为:[1,1] [2,2] [3,5] [5,7] [7,7] [7,8] [8,9] 我们的基本做法是首先定义边界结构体,边界分为两种情况:左边界和右边界。 区间划分函数,我们是首先按照各个边界在数轴上的排序,从小到大依次排列,然后顺序检测当前区间边界为左边界还是右边界,然后再检测上一个边界是左边界还是右边界。根据各种情况进行相应的操作。 程序中,我们的区间划分函数有两个版本,其中第二个版本是严格按照上述思想进行的实现。第一个版本 阅读全文

posted @ 2013-12-10 21:23 unixfy 阅读(1157) 评论(0) 推荐(0) 编辑

基于面向对象的字符图像设计
摘要:基于面向对象的字符图像设计 ——《C++沉思录》第10章 一个课堂练习的分析(下) 发表一下个人看法。面向对象的一大特点就是提供了句柄,句柄的的作用一是隐藏了具体的继承层次细节,二是实现自动管理内存,省去客户端管理内存的烦恼。 之前《字符图像》介绍了一个字符图像的设计。面向对象具有数据抽象、封装、动态绑定等特性,下面我们采用面向对象的思想来重新设计字符图像。 具体细节详见代码和注释。// 基于面向对象的字符图像设计#include using namespace std;// 前置声明,因为Picture中需要定义P_Node*指针class P_Node;// 定义句柄类(代理)class 阅读全文

posted @ 2013-12-08 15:06 unixfy 阅读(569) 评论(0) 推荐(0) 编辑

字符图像
摘要:字符图像 ——《C++沉思录》第9章 一个课堂练习的分析(上) 设计一个字符图像,用字符代替像素,实现的基本操作有加边框、将两个图像横排、竖排等。然后再对其进行一些扩展:横排下边对齐、竖排右边对齐、将重载运算符封装、去边框处理等。 具体细节详见代码和注释。// 字符图像#include #include using namespace std;// 图像类class Picture{private: int height; // 高 int width; // 宽 char* data; // 可用string代替 int isframe; // 标示... 阅读全文

posted @ 2013-12-07 15:22 unixfy 阅读(636) 评论(0) 推荐(0) 编辑

基于面向对象的表达式实现
摘要:基于面向对象的表达式实现 ——《C++沉思录》第8章 一个面向对象的程序范例 本文我们介绍一个基于面向对象的表达式实现,并对其扩展。面向对象有三个基本要素:数据抽象(封装)、继承、动态绑定(多态)。这个程序可以很好的说明这三个特性,以及说明面向对象可以很好的使得程序可维护、更灵活、易扩展。 我们给出以下表达式:(-5)*(3+4) 其表达式树为: 1.初步实现 我们定义节点类,节点指向节点的边我们用指针表示。具体实现相见代码和注释。// 基于面向对象的表达式简单实现#include #include using namespace std;// 定义节点抽象基类class Expr_Nod.. 阅读全文

posted @ 2013-12-06 19:40 unixfy 阅读(511) 评论(0) 推荐(0) 编辑

类作为其自身成员函数参数时的类型
摘要:类作为其自身成员函数参数时的类型 类作为其自身成员函数参数时可以有三种情形: 1.引用,包含const和非const引用 2.指针 3.值类型 在做类内部的成员函数参数时,编译器允许使用值类型,也就是说这时类已定义完毕。 对于其他类,如果只有声明没有定义,那么只能是引用和指针类型。 代码如下:#include using namespace std;class T{private: int n;public: T(); T(int); T(int, T); // 这里参数的类型可以是类自身的值类型,不仅仅是引用或指针类型 //T(int, const T&) ... 阅读全文

posted @ 2013-12-06 19:32 unixfy 阅读(606) 评论(0) 推荐(0) 编辑

句柄类的实现:分割引用计数和原数据
摘要:句柄类的实现:分割引用计数和原数据 ——《C++沉思录》第7章 句柄:第二部分 《句柄类》中,介绍了一种句柄的简单实现,其基本结构就是定义了三个类:Point类、Handle类、UPoint类。其中Point为实际的原数据类,Handle为句柄类,UPoint为实际操作的数据类,其成员除了Point的一个对象外还有个int型的技术。 这里我们先将UPoint中的两个成员分割,之后再将int型技术进行封装成一个标准的引用技术类UseCount。 1.Point和int 删除UPoint类,并将Handle中的UPoint* up指针删除,添加Point和int指针。#include using 阅读全文

posted @ 2013-12-05 19:57 unixfy 阅读(520) 评论(0) 推荐(0) 编辑

句柄类
摘要:句柄类 ——《C++沉思录》第六章 句柄:第一部分 三个类: Point:主体类,表示实际的数据 Handle:句柄类,用来引用代理主体类 UPoint:对Point的封装,增加了一个use count成员,用来记录主体类对象被引用代理的次数。该类完全可以省略,但是添加此类的好处是更便于管理。 对Handle的拷贝构造函数和赋值运算符的实现是通过对UPoint对象的use count修改来完成的。Handle中有两个写函数,有两种实现方式:指针语义和值语义,这里涉及了一项技术称作写时赋值(copy on write)。 具体代码如下:// 句柄类#include using namespace 阅读全文

posted @ 2013-12-02 12:49 unixfy 阅读(460) 评论(0) 推荐(0) 编辑

导航

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