随笔分类 -  数据结构和算法

摘要:例如”ababc",要求返回"ab"。因为"ab”连续重复出现且最长。用C/C++语言写一个函数完成该算法 1 void GetSub(char* str) 2 3 { 4 5 char *p,*q,*temp; 6 7 p = str; 8 9 q = p + 1;10 11 int len = 0;//记录连续重复子串的长度12 13 int max = 0;//记录连续重复子串的最大长度14 15 char data[100];//临时数组,用于保存最长重复子串16 17 18 19 while(*p != '\0')20 21 { 阅读全文
posted @ 2014-02-17 13:19 【Winco】 阅读(617) 评论(0) 推荐(0) 编辑
摘要:1 int CheckPow2(int num) 2 { 3 if (num < 0) 4 return -1; 5 6 if (0 == (num & (num - 1))) 7 return 0; 8 else 9 return 1;10 } 阅读全文
posted @ 2013-10-09 17:47 【Winco】 阅读(194) 评论(0) 推荐(0) 编辑
摘要:方法一、简单递归这个就不说了,小n怡情,大n伤身啊……当n=40的时候,就明显感觉到卡了,不是一般的慢。 1 //输出第n个 Fibonacci 数 2 #include 3 using namespace std; 4 5 long long Fibonacci(int n) 6 { 7 if(n>n, n) 16 cout 3 #include 4 #define MAXN 300 5 using namespace std; 6 7 long long F[MAXN]; 8 int i; 9 long long Fibonacci(int n)1... 阅读全文
posted @ 2013-09-09 12:10 【Winco】 阅读(684) 评论(0) 推荐(0) 编辑
摘要:描述计算 1 至 n 中数字 X 出现的次数,其中n≥1,X∈[0,9]。解题思路这是一道比较简单的题目,举个例子先:假设n=11,X=1,那么就是求 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 这 11 个数字中 1 出现的次数,很容易能看出来结果为 4,在 1 和 10 中各出现了一次,在 11 中出现了两次。最简单的办法就是依次遍历 1 至 n,再分别求每个数字中 X 出现的次数,代码如下所示: 1 #include 2 3 // 计算数字 X 在 n 中出现的次数。 4 int countOne(int n, int x) { 5 int cnt ... 阅读全文
posted @ 2013-09-09 10:16 【Winco】 阅读(464) 评论(0) 推荐(0) 编辑
摘要:什么是KMP算法:KMP是三位大牛:D.E.Knuth、J.H.Morris和V.R.Pratt同时发现的。其中第一位就是《计算机程序设计艺术》的作者!!KMP算法要解决的问题就是在字符串(也叫主串)中的模式(pattern)定位问题。说简单点就是我们平时常说的关键字搜索。模式串就是关键字(接下来称它为P),如果它在一个主串(接下来称为T)中出现,就返回它的具体位置,否则返回-1(常用手段)。首先,对于这个问题有一个很单纯的想法:从左到右一个个匹配,如果这个过程中有某个字符不匹配,就跳回去,将模式串向右移动一位。这有什么难的?我们可以这样初始化:之后我们只需要比较i指针指向的字符和j指针指向的 阅读全文
posted @ 2013-08-17 15:36 【Winco】 阅读(334) 评论(0) 推荐(0) 编辑
摘要:部分童鞋应该可以从《使用方形游移匹配算法来勾勒图像轮廓》一文看到它的潜在用途了,只要获得图像的轮廓,转换成Box2D形状就相当容易。但有个问题,所生成的形状会有太多点,范例中处理的logo就多达2200点,太多。点的数量真心需要减少。为了解决这个问题,Ramer-Douglas-Peucker算法闪亮登场。该算法的思想为,给定一条由若干线段组成的曲线,找出包含的点数少且外观相近的曲线。该算法基于原始曲线与简化曲线直接最大间距定义了“dissimilar”。简化曲线由定义原始曲线的点的一个子集组成。Marius Karthaus为RDP算法写了一个非常不错的javascript范例,我在此基础上 阅读全文
posted @ 2013-03-06 17:55 【Winco】 阅读(4544) 评论(0) 推荐(0) 编辑
摘要:你曾经好奇过图形软件是如何追踪一个图像轮廓的吗?没有嘛?我实际上就没有好奇过,但是当我做一个复杂项目时候,我发现用边界矩形算法来追踪图形轮廓是多么的有魔力。处理的方法是很简单的: 1)找到一个图像边界上的像素(这跟边界矩形没关系,只是假设你找到了这个像素)。这个像素就是需要分析的。 2)假设有一个2x2的像素矩形,其中包括位于矩阵左上角或右下角的当前处理像素。 3)这个时候,你有四个像素,每个都可以是透明或不透明。这样我们就有16种2x2的矩阵。 尽管当我们移到图像边界时,透明跟不透明像素都不会看到。 4)根据2x2矩阵中不透明像素的位置和个数,我们可以猜测轮廓的方向,将... 阅读全文
posted @ 2013-03-06 17:47 【Winco】 阅读(832) 评论(0) 推荐(0) 编辑
摘要:排序(Sorting) 是计算机程序设计中的一种重要操作,它的功能是将一个数据元素(或记录)的任意序列,重新排列成一个关键字有序的序列。稳定度(稳定性)一个排序算法是稳定的,就是当有两个有相等关键的纪录R和S,且在原本的列表中R出现在S之前,在排序过的列表中R也将会是在S之前。当相等的元素是无法分辨的,比如像是整数,稳定度并不是一个问题。然而,假设以下的数对将要以他们的第一个数字来排序。(4,1)(3,1)(3,7)(5,6)在这个状况下,有可能产生两种不同的结果,一个是依照相等的键值维持相对的次序,而另外一个则没有:(3,1)(3,7)(4,1)(5,6) (维持次序)(3,7)(3,1)( 阅读全文
posted @ 2013-02-22 18:21 【Winco】 阅读(251) 评论(0) 推荐(0) 编辑
摘要:快速排序(Quicksort)是对冒泡排序的一种改进。由C. A. R. Hoare在1962年提出。它的基本思想是:通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,以此达到整个数据变成有序序列。设要排序的数组是A[0]……A[N-1],首先任意选取一个数据(通常选用第一个数据)作为关键数据,然后将所有比它小的数都放到它前面,所有比它大的数都放到它后面,这个过程称为一趟快速排序。值得注意的是,快速排序不是一种稳定的排序算法,也就是说,多个相同的值的相对位置也许会在算法结束时 阅读全文
posted @ 2013-02-18 16:49 【Winco】 阅读(204) 评论(0) 推荐(0) 编辑
摘要:二分查找又称折半查找,优点是比较次数少,查找速度快,平均性能好;其缺点是要求待查表为有序表,且插入删除困难。因此,折半查找方法适用于不经常变动而查找频繁的有序列表。首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。 算法要求:1、必须采用顺序存储结构。2、必须按关键字大小有序排列。 算法复杂度:假设数组长度为n,其算法复杂... 阅读全文
posted @ 2013-02-18 16:43 【Winco】 阅读(150) 评论(0) 推荐(0) 编辑
摘要:虽然A*(读作A星)算法对初学者来说是比较深奥难懂,但是一旦你找到门路了,它又会变得非常简单。网上有很多解释A*算法的文章,但是大多数是写给那些有一定基础的人看的,而您看到的这一篇呢,是真正写给菜鸟的。本篇文章并不想给这个算法题目作一些权威性论断,而是阐述它的基本原理,并为你理解更多相关资料与讨论打下基础。文章末尾给出了一些比较好的链接,放在“进阶阅读”一节之后。最后,本文不是编程规范,你将可能使这里讲述的东西编写成任何计算机语言。在本文的末尾我还给出了一个例子程序包的下载链接,也许正合你意。在这个包中有C++和Blitz Basic两个版本的程序代码,如果你只是想看看A*算法是如何运作的,该 阅读全文
posted @ 2013-01-29 22:20 【Winco】 阅读(639) 评论(0) 推荐(0) 编辑

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