随笔分类 - 编程学习-数据结构/算法
摘要:在做链表插入时,保证链表中的值是有序的,比如从小到大,依次递增。以下是今天写的一段代码的修改版。typedef struct Node{ int value; Node *next;} Node;typedef struct NodeHead{ int counter; ...
阅读全文
摘要:以下是本人根据上一篇博客随笔http://www.cnblogs.com/jiayouwyhit/p/3251832.html,所写的KMP算法代码(暂未优化),个人认为在基于上一篇博客的基础上,代码的思路是相对很清晰的。以后的KMP算法求解建议依照此版本进行代码构思。再次强调下本版本的next数组:例如:// T = a b c a b c a b c d//下标: 0 1 2 3 4 5 6 7 8 9//next: -1 0 0 0 1 2 3 4 5 6该版本的next数组的一个好处在于:字符串的下标是从零开始的,符合C++下string本身的特点;且另next[0]=-1,...
阅读全文
摘要:前言:纠结于KMP已经两天了,相较于本人之前博客中提到的几篇博文,本人感觉这篇文章更清楚地说明了KMP算法的来龙去脉。http://www.cnblogs.com/goagent/archive/2013/05/16/3068442.html1、传统的字符串匹配算法/* * 从s中第sIndex位置开始匹配p * 若匹配成功,返回s中模式串p的起始index * 若匹配失败,返回-1 */int index(const std::string &s, const std::string &p, const int sIndex = 0){ int i = sIndex, j =
阅读全文
摘要:前言:本人最近在看《大话数据结构》字符串模式匹配算法的内容,但是看得很迷糊,这本书中这块的内容感觉基本是严蔚敏《数据结构》的一个翻版,此书中给出的代码实现确实非常精炼,但是个人感觉不是很好理解。截止到目前为止,讲解KMP算法的文章,个人比较推荐有两篇:http://www.cnblogs.com/c-cloud/p/3224788.htmlhttp://www.matrix67.com/blog/archives/115这两篇文章的解释基本思路是一致的,前者提到的部分匹配值就是后者提到的P[]数组(均对应于《算法导论》中KMP算法的next数组的求解),但是不同于《大话数据结构》和严蔚敏教材里
阅读全文
摘要:1. 先上代码: void swap1(int &a, int &b){ a ^=b; b ^=a;//b=(a^b)^b=a a ^=b;//a=(a^b)^a=b } void swap2(int& a, int& b) { a+=b;//a=a+b b-=a;//b=b-(a+b)=-a ...
阅读全文
摘要:1.基本原理 在数学中,辗转相除法,又称欧几里得算法,是求最大公约数的算法。辗转相除法首次出现于欧几里得的《几何原本》(第VII卷,命题yⅠ和Ⅱ)中,而在中国则可以追溯至东汉出现的《九章算术》。 两个整数的最大公约数是能够同时整除它们的最大的正整数。辗转相除法基于如下原理:两个整数的最大公约数等于其中较小的数和两数的相除余数的最大公约数。例如,252和105的最大公约数是21(252 = 21...
阅读全文
摘要:本文转载于http://blog.csdn.net/effective_coder/article/details/8697789。一、基本概念 在计算机科学中,分治法是一种很重要的算法。字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。这个技巧是很多高效算法的基础,如排序算法(快速排序,归并排序),傅立叶变换(快速傅立叶变换)…… 任何一个可以用计算机求解的问题所需的计算时间都与其规模有关。问题的规模越小,越容易直接求解,解题所需的计算时间也越少。例如,对于n个元素
阅读全文
摘要:本文还来不及看,暂存于此。该算法是目前号称最快的八皇后问题求解算法。 核心代码如下: void test(int row, int ld, int rd) { int pos, p; if ( row != upperlim ) { pos = upperlim & (~(row | ld | rd )); ...
阅读全文
摘要:八皇后问题是在8*8的棋盘上放置8枚皇后,使得棋盘中每个纵向、横向、左上至右下斜向、右上至左下斜向均只有一枚皇后。八皇后的一个可行解如图所示: ...
阅读全文
摘要:一、基本内容: C语言中的函数可以递归调用,即:可以直接(简单递归)或间接(间接递归)地自己调自己。 要点: 1、C语言函数可以递归调用。 2、可以通过直接或间接两种方式调用。目前只讨论直接递归调用。 二、递归条件 采用递归方法来解决问题,必须符合以下三个条件: 1、可以把要解决的问题转化为一个新问题,而这个新的问题的解决方法仍与原来的解决方法相同,只是所处理的...
阅读全文
摘要:以下转自刘海涛个人博客:http://zhedahht.blog.163.com/blog/static/2541117420114331616329/ 题目:在8×8的国际象棋上摆放八个皇后,使其不能相互攻击,即任意两个皇后不得处在同一行、同一列或者同一对角斜线上(并不仅只是最长的两条对角线)。下图中的每个黑色格子表示一个皇后,这就是一种符合条件的摆放方法。请求出总共有多少种摆法。 ...
阅读全文
摘要:以下转自刘海涛的网易博客:http://zhedahht.blog.163.com/blog/static/254111742007499363479/ 题目:输入一个字符串,打印出该字符串中字符的所有排列。例如输入字符串abc,则输出由字符a、b、c所能排列出来的所有字符串abc、acb、bac、bca、cab和cba。 分析:这是一道很好的考查对递归理解的编程题,因此在过去一年中频繁出现在...
阅读全文
摘要:汉诺塔的算法主要包括3个步骤:第一,把a上的n-1个盘通过c移动到b。第二,把a上的最下面的盘移到c。第三,因为n-1个盘全在b上了,所以把b当做a重复以上步骤就好了。所以算法看起来就简单多了。不过,思考过程还是很痛苦的,难以理解。递归中会保存数据的好处在这里又得到体现,太神奇了。 汉诺塔代码如下: ? ...
阅读全文
摘要:1.基于栈的问题分析 我们把n个元素的出栈个数的记为f(n), 那么对于1,2,3, 我们很容易得出: f(1) = 1 //即 1 f(2) = 2 //即 12、21 ...
阅读全文
摘要:希尔排序的实质就是分组插入排序,该方法又称缩小增量排序,因DL.Shell于1959年提出而得名。 该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个“增量”的元素组成的)分别进行直接插入排序,然后依次缩减增量再进行排序,待整个序列中的元素基本有序(增量足够小)时,再对全体元素进行一次直接插入排序。因为直接插入排序在元素基本有序的情况下(接近最好情况),效率是很高的,因此希尔...
阅读全文
摘要:直接插入排序(Insertion Sort)的基本思想是:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子序列中的适当位置,直到全部记录插入完成为止。 设数组为a[0…n-1]。 1. 初始时,a[0]自成1个有序区,无序区为a[1..n-1]。令i=1 2. 将a[i]并入当前的有序区a[0…i-1]中形成a[0…i]的有序区间。 3. i++...
阅读全文
摘要:已经在VC6下运行过。 //堆排序 //默认非叶子节点i以下的节点都已经排好次序,已经成为排好次序的最大/小堆 void HeapAdjust(int* source, int s, int t) { int temp,j; temp=source[s]; for (j=2*s+1;j=source[j]) ...
阅读全文
摘要:版本一:参考《大话数据结构》中的代码实现。 #define MAXSIZE 10 void merging(int* source,int* result, int start, int middle, int end) { int i,j,k; k=start,i=start,j=middle+1; while(i<=mid...
阅读全文
摘要:问题1 按顺时针方向构建一个m * n的螺旋矩阵(或按顺时针方向螺旋访问一个m * n的矩阵):2 在不构造螺旋矩阵的情况下,给定坐标i、j值求其对应的值f(i, j)。比如对11 * 7矩阵, f(6, 0) = 27 f(6, 1) = 52 f(6, 3) = 76 f(6, 4) = 63构建螺旋矩阵对m * n 矩阵,最先访问最外层的m * n的矩形上的元素,接着再访问里面一层的 (m - 2) * (n - 2) 矩形上的元素…… 最后可能会剩下一些元素,组成一个点或一条线(见图1)。对第i个矩形(i=0, 1, 2 …),4个顶点的坐标为:(i, i) -------------
阅读全文

浙公网安备 33010602011771号