摘要:好久没写过了,由于工作和实实在在的技术研发不怎么挂钩,所以平时没有关注过技术方面的,更别提写代码了。所以这个博客就一直未更新。最近工作遇到了一个问题,至今还未解决,其中一个环节是需要将两个文件合并,找了一些工具发现用着都不太顺手,索性自己写一个吧,想想有一年多没写过代码了。今天下午开始写,期间也借鉴...
阅读全文
摘要:《Objective-C编程》部分示例 最近在看《Objective-C编程》顺带实现了书中部分示例代码。如果感兴趣可以自行 下载(点我)。 通过本书大致了解了Objective-C这门程序设计语言。下一步主要是学习iOS相关开发。《Objective-C编程》中也少量介绍了一些回调机制:动作-目标对、辅助对象、通告等,还有协议相关内容,另外还有MVC设计模式等。对于iOS开发这些基础理论理解的还是不够透彻。下一步学习《iOS编程》,希望能早日做出一款实现自己的idea的iOS APP。
阅读全文
摘要:Futoshiki求解 Futoshiki是对于一个n的方阵,需要满足如下条件: ·每一行和每一列的元素都不能重复,即每一行和每一列1到n,n个数字都出现,且只出现一次。 ·同一行或同一列中相邻两个元素需要满足预先设定的一些关系,比如大于、小于等等。 例如,有以下样例: 这是一个5的方阵,方阵中元素为0的元素表示该元素为空,即还没有放置1-n中的某个数字。初始方阵中有些元素已经被放置了,这些元素不能被修改。同一行的元素被|字符间隔,同时也有关系符,来规定相邻两个元素的关系。同样,同一列的元素被-字符间隔,同时^和v字符用来规定相邻两个元素间的关系。 对应于上面的初始方阵,有
阅读全文
摘要:约束条件下的优化问题 给定一系列训练,每个训练有以下几个属性:名字能量消耗可以被选的阶段个数阶段1阶段2…… 有x个阶段,每个阶段又有如下以下两个限制: 1.每个阶段中最多不能包含超过n个训练,也就是说训练个数小于等于n; 2.每个阶段里的能量消耗总和不得大于m。 在这种约束条件下,求得所有阶段能耗消耗总和最大的组合。每个训练最多可以被选择一次,可以不被选择。 这个问题咋一看有点类似于背包问题,每个训练最多可以被选择一个,有点像是01背包问题,并且也有限制条件,比如每个阶段不得大于n个训练,能耗之和不得大于m,但最终也想求得所有阶段能耗最大的组合。 背包问题有很多种,诸如01背包、完全背包、多
阅读全文
摘要:家谱树的建立和求解最大路径 家谱树也称为家谱图,用来标识家族中人员的关系等。 给定一个家谱树文件,文件格式是: 1.第一行是一个整型的数n,表示这个家谱树中成员的个数。 2.后面紧跟着n行数据,每行代表一个成员,其格式为:名字姓性别年龄 由四部分信息组成,其中性别M表示男性,F表示女性。 3.后面继续跟m行数据,m未知,用来表示成员间的父母-孩子关系,其格式为:孩子名孩子姓父亲名父亲姓母亲名母亲姓 我们要做的工作是: 1.设计合理的数据结构,用来保存每个成员、成员间的关系,以及整个家谱树。 2.根据指定的性别,找到在家谱树中性别都为该性别的最长路径。 3.求解家谱树中年龄之和最大的路径。 比如
阅读全文
摘要:结构体的赋值 1.指针的赋值 区分对指针本身赋值和对指针指向的空间进行赋值。 2.数组的赋值 不能对数组名进行赋值,对数组的赋值实质上是数组中元素一个一个的拷贝。 3.结构体的赋值 结构体中的指针 结构体中含有指针时,对结构体赋值类似于指针的赋值,只是浅赋值,如果想深赋值,还需要额外处理。 结构体中的数组 结构体含有数组时,对结构体进行赋值,可以实现数组的直接赋值,而外部的数组不能进行直接赋值,而是一个一个的拷贝。 结构体的直接赋值,实质上是对结构体的完全拷贝,不管结构体中有指针还是数组,拷贝的内容都是结构体本身,也就是说结构体中有指针时,拷贝的是指针本身;结构体中有数组时,拷贝的是数组。 对
阅读全文
摘要:图的建立、广度优先遍历和深度优先遍历 图分为有向图和无向图,再根据是否有权重又可以分为有权重图和无权重图。图常用的表示方式有邻接矩阵和邻接表。这里我们处理的图是有向、无权重图,采用的表示方式是邻接表。 图的数据保存在文件中,比如: a 1 b b 2 c e c 1 f d 2 c f e 1 a f 0 其中,第一个元素表示图中节点的名字,第二元素表示其可以直接到达的节点个数,后面紧跟着直接可以达到的节点。 我们采用的表示方式是邻接表,邻接表首先针对图中的节点定义一个数组,用来记录每个节点,数组中的每个节点元素后面跟着一个链表,在该链表中记录着其可以直接到达的节点。 节点的定义有以下几个部分
阅读全文
摘要:多叉树的设计、建立、层次优先遍历和深度优先遍历 早起曾实现过一个简单的多叉树《实现一个多叉树》。其实现原理是多叉树中的节点有两个域,分别表示节点名以及一个数组,该数组存储其子节点的地址。实现了一个多叉树建立函数,用于输入格式为A B。A表示节点的名字,B表示节点的子节点个数。建立函数根据用户的输入,首先建立一个新的节点,然后根据B的值进行深度递归调用。用户输入节点的顺序就是按照深度递归的顺序。另外,我们实现了一个层次优先遍历函数。该函数用一个队列实现该多叉树的层次优先遍历。首先将根节点入队列,然后检测队列是否为空,如果不为空,将队列出队列,访问出队列的节点,然后将该节点的子节点指针入队列,依次
阅读全文
摘要:几个简单的排序算法及其优化 排序算法是数据结构、算法中的基本组成部分,TAOCP中专门有一卷是讲排序算法的。网上有个排序算法的介绍和博客很多,可以自行谷歌百度之。相关基本介绍可以查看Wiki。 这里我们简单介绍几个简单的排序算法:冒泡排序、选择排序、插入排序、快速排序。其中,我们分别对冒泡排序、选择排序、插入排序做了小小的优化,快速排序算法我们采用的分割策略是《快速排序的三种分割策略》中介绍的第三种分割策略。 冒泡排序的原理是始终比较两个相邻的元素,如果符合条件就交换。其改进方法是,添加一个标示符,初始的时候用来表示待排序序列时已经有序的,如果存在交换操作,则说明原来序列不是有序的,修改该标示
阅读全文
摘要:快速排序专辑 有关快速排序的几篇博文:题目网址重谈快速排序链接快速排序的三种分割策略链接基于快速排序的快速选择链接 有关内容持续更新中……
阅读全文
摘要:基于快速排序的快速选择 ——《数据结构与算法分析——C语言描述》 快速选择有很多方法,这里不做一一介绍。《重谈快速排序》中我们介绍了快速排序的相关实现细节。这里我们介绍一种基于快速排序的快速选择方法。 其实现原理和快速排序类似。 给出一个序列,我们不知道该序列是否已经排好序,如果我们想从中选择第k小的数,该怎么做?最简单最直观的方法是对这个序列进行排序,然后依据k选择索引为k-1数即可。由于排序的时间复杂度为O(NlogN)。所有这种选择第k小的数的时间复杂度是O(NlogN)。 这样会造成一定的浪费,因为我们仅仅是想从中选择第k个小的数,而对序列进行排序导致前k-1个数和后面的n-k个数都是
阅读全文
摘要:快速排序的三种分割策略 在前面《重谈快速排序》中,我们提到快速排序有两个关键点,分别是:1.枢纽元的选择;2.选定枢纽元后,如何对序列进行左右分割。枢纽元的选择有好几种方法,比如:选择第一个元素作为枢纽元,或者选择中间一个元素,抑或选择最后一个元素,怎么选都可以,也可以随机选择一个元素作为枢纽元。由于快速排序特点,如果枢纽元选择不当,其时间复杂度有可能变为O(N*N)。所以即便是采用伪随机的方式随机选择一个元素作为枢纽元,也有可能选择不当。另外,随机选择需要一定的消耗。除此之外,为了避免一次随机造成的不良影响,可以随机多次进行选择,比如随机选取其中三个元素,选择这三个元素中的中位数作为枢纽元。
阅读全文
摘要:通过赔率预测比赛 根据历往博彩公司开的赔率以及每次比赛的胜负,运用分类算法(本质上是二元分类,因为只是针对胜负)进行未来比赛的预测。得到的结果并不算很理想。主场情况下,最好只能达到七成的准确率,客场更差,对于二串一的玩法这种准确率无法胜任。 采用的分类算法是KNN,KNN的实现也可以详见之前的C++Blog上的博文,特征向量间距离是采用欧氏距离,特征向量间距离和相似度的计算可以详见C++Blog博文。 发表一下个人对于基于统计学习方法的看法:机器学习或者基于统计的方法是没有办法的办法,无法通过规则得到良好的结果,所以只能依赖于历史数据,经过大规模运算得到一个看上去还可以的结果。这种看上去还可以
阅读全文
摘要:原码·反码·补码 本文可以说是比较水,主要是谈一下原码、反码、补码的东西。原码、反码、补码的定义我们这里不做介绍,可以Google之,查询相关Wiki或百度百科。 我们主要对一个数,如果转换为原码、反码、补码,并且如何由原码、反码、补码转换为原数。下面我们给出几种转换的代码实现,并对代码做一下解释。 需要说明的是,我们并没有对正数用原码负数用补码进行分开讨论,而是对正负数、无符号数都求了原码、反码、补码。关于原码、反码、补码的内部机制,为什么有产生这些,为什么会用它们,用它们有什么好处,我们也不做介绍,如果感兴趣的话可以参考《深入理解计算机系统》。 我们先给出相关的程序,然
阅读全文
摘要:ASCII码表以及不同进制间的O(1)转换 一、ASCII码表 ASCII全称为American Standard Code for Information Interchange,美国信息交换标准代码。其值范围为0-127,总共128个字符。 下面我们对着128个字符进行输出,分为五列:二进制、八进制、十进制、十六进制、字符。具体程序如下:// 生成ASCII码表#include #include #include using namespace std;string IntTo_(int num, int radix, string& ret){ int index = ret.s
阅读全文
摘要:字节存储数据 一个字节有8个bit,一个int一般情况下有32个bit(4个字节),一个long有64个bit(8个字节)。 对于一个数据:0123456789 我们可以用10个int来存储,共占用40个字节。如果用10个long来存储,则共占用80个字节,如果用10个char来存储,则共占用10个字节。 int有32个bit,其表示范围为2^(-31)~2^31-1 long有64个bit,其表示范围为2^(-63)~2^63-1 char有8个bit,其表示范围为2^(-7)~2^7-1,如果是unsigned char,其表示范围为0~2^8-1 显然int、long、char的表示能力
阅读全文
摘要:进制之间的转换一、谈谈几个库函数函数原型功能参考atoiint atoi(const char* nptr);把字符串换化成整型数百度百科itoachar* itoa(int value, char* string, int radix);将整型数转换为radix进制数的字符串形式百度百科atollong atol(const char* nptr);把字符串转换成长整型数百度百科atofdouble atof(const char* nptr);把字符串转换成浮点数百度百科strtoddouble strtod(const char* nptr, char** endptr);把字符串转换成
阅读全文
摘要:输入日期显示星期几 比如今天是2013年8月2日,星期五。我们现在就是要实现这样一个功能,给定一个日期,得到该日期是星期几。 比如:日期星期2013年8月2日星期五20130803星期六2013-08-04星期天2013-6-18星期二2014/1/16星期四2000/8/15星期二 我们需要解决的问题有如下几点: 1.对输入格式进行归一化处理; 2.计算将来或以前某一天是星期几; 一、对输入格式的归一化处理 我们首先实现对输入格式的归一化处理,程序如下:// 输入日期的归一化处理#include #include using namespace std;struct date{ in...
阅读全文
摘要:字符串替换 C++ string 中有自带的replace替换函数,其替换方式有以下几种: (http://www.cplusplus.com/reference/string/string/replace) 这几种方式都是只能针对某一个目标进行替换,不能对字符串中出现多次目标的情形进行全部替换。下面我们给出对字符串中所有目标进行替换的程序。一、两种基本的全部替换方式 比如给定一目标字符串(以下参考自Vimer):12212 我们将其中的“12”替换为“21”,有两种替换方式,分别为: 1)进行distinct替换,即每次替换后,对替换...
阅读全文