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

【算法剖析】寻找两个已序数组中的第k大元素
摘要:1、问题描述 给定两个数组A与B,其大小分别为m、n,假定它们都是已按照增序排序的数组,我们用尽可能快的方法去求两个数组合并后第k大的元素,其中,1\le k\le(m+n)。例如,对于数组A=[1,3,5,7,9],B=[2,4,6,8]。我们记第k大的数为max_{k-th},则k=4时,max_{4-th}=4。这是因为排序之后的数组A+B=[1,2,3,4,5,6,7,8,9],第4大的数是4。我们针对这一个问题进行探讨。2、算法一 第一眼看到这个题的时候,我们能够很快地想出来最基本的一种解法:对数组A和B进行合并,然后求出其第k大的数,即找到答案。合并的过程,我们可以参考归并排序.. 阅读全文
posted @ 2013-06-28 19:42 Chenny Chen 阅读(3292) 评论(6) 推荐(1) 编辑
【算法剖析】最长公共子序列与最长递增子序列的浅析
摘要:最长公共子序列 最长公共子序列(Longest Common Sequence,LCS)问题是典型的适用于动态规划求解的问题。LCS的定义是: 给定一个串,以及另外一个串,如果存在一个单调增的序列,对于所有,有,则称是的一个子序列。如果对于两个串,,既是的子序列,又是的子序列,那么就称是与的公共子序列,LCS就是指所有子序列中最长的那个子序列(可能有多个)。 使用动态规划求解LCS时,首先我们需要找出递推公式。令,,并设为它们的LCS。我们可以看到: (1)如果,并且,那么是与的LCS; (2)如果,并且,那么是与的LCS; (3)如果,并且,那么是与的LCS; 上述... 阅读全文
posted @ 2012-12-18 17:25 Chenny Chen 阅读(1278) 评论(2) 推荐(0) 编辑
【USACO】两道简单的ACM试题
摘要:SuperPrime Rib题目(简述):找出某一长度的超级素数。所谓的超级素数,例如7331:其中7331是素数,733是素数,73是素数,7是素数。即每次从该数中去掉最后一位数后,依然是素数的素数,被称为超级素数(superprime)。分析:判断一个数是不是超级素数,我们需要判断n次,n为这个数的位数。为了使程序更快,我们应该首先判断最高位是不是素数,然后判断最高两位是不是素数……直到判断到这个数本身是不是素数。其次,我们并不需要遍历所有的n位数,因为很多数直接就可以排除掉:除了最高位,其他任何位上有偶数的排除,1开头的数排除,至于为什么,原因很简单,大家可以自己思考。这样之后,我们其实 阅读全文
posted @ 2012-02-17 11:06 Chenny Chen 阅读(529) 评论(0) 推荐(0) 编辑
【经典数据结构算法】(4)二叉树求和为定值的所有路径
摘要:1 /* 2 题目:输入一个整数和一颗二叉树。 3 从树的根结点开始往下访问一直到叶结点所经过的所有结点形成一条路径。 4 打印出与输入整数相等的所有路径。 5 例如 输入整数22和如下二元树 6 10 7 / \ 8 5 12 9 / \10 4 711 则打印出两条路径:10,12和12,5,712 分析:13 在二叉树中寻找满足条件的所有结点序列,需要输出所有的序列。14 此时,很自然的就应该想到使用栈这样的数据结构。15 访问结点为一个函数,在进入这个函数的时候,首先把... 阅读全文
posted @ 2011-11-20 19:26 Chenny Chen 阅读(1243) 评论(0) 推荐(0) 编辑
【经典数据结构算法】(3)最大子数组和
摘要:1 /************************************************************************/ 2 /* 3 题目: 4 输入一个整型数组,数组里有正数也有负数。数组中连续的一个或多个整数组成一个子数组,每一个子数组都有一个和。 5 求所有子数组的和的最大值。要求时间复杂度为O(n)。 6 例如: 7 输入的数组为1,-2,3,10,-4,7,2,-5,和最大的子数组为3,10,-4,7,2。 8 因此,输出为该子数组的和18. 9 10 分析:11 可以使用Max_Sum来保... 阅读全文
posted @ 2011-10-17 21:56 Chenny Chen 阅读(317) 评论(0) 推荐(0) 编辑
【经典数据结构算法】(2)设计包含min的栈
摘要:1 /* 2 * 题目: 3 * 设计包含min的栈 4 * 定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素。 5 * 要求函数min、push以及pop的时间复杂度都是O(1) 6 */ 7 8 /* 9 * 分析: 10 * 自己曾经用了一天时间,也没有想出,后来看了别人的分析才知道比较好的解答方法。 11 * 这道题是典型的用空间复杂度换时间复杂度的问题,关键点在于如何保存最小的元素。 12 * 既然要求了时间复杂度低,那么就需要较高的空间复杂度,方法是设计另外一个平行栈,用来保存当前... 阅读全文
posted @ 2011-10-02 22:34 Chenny Chen 阅读(179) 评论(0) 推荐(0) 编辑
【经典数据结构算法】(1)二叉查找树与双向链表之间的转换
摘要:题目参看csdn上的一个很经典的帖子,http://topic.csdn.net/u/20101126/10/b4f12a00-6280-492f-b785-cb6835a63dc9.html?60918。但代码都是自己使用C语言写的,思路基本上都是自己想出的,如果参考了帖子上别人的思想,则会注明。 1 /* 2 * 将二元查找树转变为排序的双向链表 3 * 题目:输入一颗二元查找树,将该二元查找树转换成一个排序的双向链表 4 * 要求不能创建任何新的结点,只调整指针的指向。 5 * 如: 6 * 10 7 ... 阅读全文
posted @ 2011-10-01 21:15 Chenny Chen 阅读(861) 评论(2) 推荐(0) 编辑
【数据结构复习】(2)线性表(一)
摘要:线性表的定义 线性表是最简单的数据结构,一个线性表是由n个数据元素的有限序列。具有下列特点: (1)存在唯一一个被称为“第一个”的数据元素; (2)存在唯一一个被称为“最后一个”的数据元素; (3)除了第一个之外,集合中的每一个数据元素均只有一个前驱; (4)除最后一个之外,集合中的每一个数据元素均只有一个后继。线性表的实现 下面在Visual Stduio C++ 6.0环境下对线性表的实现进行描述。由于线性表中的数据元素可以为许多类型(int、float、char等等),为了方便起见,只介绍int型作为线性表的数据元素的类型的线性表。并且在《数据结构(C语言版)... 阅读全文
posted @ 2011-09-11 15:34 Chenny Chen 阅读(518) 评论(0) 推荐(0) 编辑
【数据结构复习】(1)绪论
摘要:前言 由于自己已经大四,开始决定写这个博客,记录下自己每一天一点一滴的进步,希望自己的收获能与大家一同分享。数据结构这门课是我在大二上学期所学的,由于之前学习C语言的时候已经接触了常用的一些数据结构,加之自己以前也看过不少数据结构方面的书,因此学习起来比较轻松。马上要参加2012年的研究生入学考试,数据结构作为专业课的一门,就要重新开始复习了。因此通过记录这个博客,来每天更新自己的复习成果。这是一个系列,希望自己能够坚持下去。所用的教材是清华大学出版的《数据结构(C语言版)》。基本概念 数据(data):客观事物的符号表示。【CS】指所有能输入到计算机中并被计算机程序处理的符号的总称。【注.. 阅读全文
posted @ 2011-09-06 19:33 Chenny Chen 阅读(183) 评论(0) 推荐(0) 编辑