![](https://img-blog.csdnimg.cn/20201014180756780.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
算法与数据结构
文章平均质量分 68
fisher_jiang
这个作者很懒,什么都没留下…
展开
-
那些优雅的数据结构(1) : BloomFilter——大规模数据处理利器
原文链接: http://www.cnblogs.com/heaad/archive/2011/01/02/1924195.htmlBloomFilter——大规模数据处理利器 Bloom Filter是由Bloom在1970年提出的一种多哈希函数映射的快速查找算法。通常应用在一些需要快速判断某个元素是否属于集合,但是并不严格要求100%正确的场合。一. 实例转载 2011-12-11 04:35:36 · 15376 阅读 · 0 评论 -
皇宫看守
皇宫看守 问题描述太平王世子事件后,陆小凤成了皇上特聘的御前一品侍卫。皇宫以午门为起点,直到后宫嫔妃们的寝宫,呈一棵树的形状;某些宫殿间可以互相望见。大内保卫森严,三步一岗,五步一哨,每个宫殿都要有人全天候看守,在不同的宫殿安排看守所需的费用不同。可是陆小凤手上的经费不足,无论如何也没法在每个宫殿都安置留守侍卫。编程任务:帮助陆小凤布置侍卫,在看守全部宫殿的前提下,使得原创 2008-05-27 22:50:00 · 4115 阅读 · 0 评论 -
包含点集所有点的最小圆的算法
包含点集所有点的最小圆的算法 求一个最小圆包含给定点集合所有点的问题是在实践和理论上都十分感兴趣的一个问题。这个圆心可以看成是点集的中心。在图形学中,圆也常可取作边界盒,使用它可减少很多不必要的计算。在空间数据库中可将该问题用于建立空间数据的索引以提高查询速度。 1. 在点原创 2008-05-25 23:43:00 · 6141 阅读 · 0 评论 -
多重幂计数问题
设给定n个变量x1,x2…,xn。将这些变量依序作底和各层幂,可得n重幂如下 这里将上述n 重幂看作是不确定的,当在其中加入适当的括号后,才能成为一个确定的n重幂。不同的加括号方式导致不同的n重幂。例如,当n=4 时,全部4重幂有5个。编程任务:对n个变量计算出有多少个不同的n重幂。将输入在xk处断开,分为两个子序列,分别加括号。由此可得如下递归式: 解此递归方程可得,f(n)实原创 2008-05-26 17:39:00 · 3973 阅读 · 1 评论 -
序关系计数问题
序关系计数问题问题描述:用关系“A=B=C,A=BB=C将n 个数(1 设n个数可列出的关系式的个数为g(n), 下面我们设法总结规律找出g(n)的递推关系:对于一个关系式@a1@a2@a3....@an其中@表示 a1=a2=a3...=akak+1@...@an根据组合定义,从n个对象中选出k个组成关系式 a1=a2=a3...=ak,相当于在n个数中选取k个组合,因此关系式a1=a2=.原创 2008-05-22 17:52:00 · 4020 阅读 · 5 评论 -
一道经典的面试题:如何从N个数中选出最大(小)的n个数?
一道经典的面试题:如何从N个数中选出最大(小)的n个数?北京交大LuoBin这个问题我前前后后考虑了有快一年了,也和不少人讨论过。据我得到的消息,Google和微软都面过这道题。这道题可能很多人都听说过,或者知道答案(所谓的“堆”),不过我想把我的答案写出来。我的分析也许存有漏洞,以交流为目的。但这是一个满复杂的问题,蛮有趣的。看完本文,也许会启发你一些没有想过的解决方案(我一直认为堆也许转载 2008-05-23 15:34:00 · 7955 阅读 · 10 评论 -
n个sorted数组,每个数组n个元素,求所有元素中值
n个sorted数组,每个数组n个元素,求所有元素中值最好的方法。最基本的方法就是n*n个元素放到一起,直接求中值,这个有现成的办法就是O(n^2)一个比较好的方法可以达到O(n(logn)^2),描述如下:1、取出每个数组的中值,一共n个中值,所以O(n)2、取出中值的中值,用O(n)3、验证这个值是否是全部元素的中值,方法是对每个sorted数组折半查找,用O(logn),一共n个数组原创 2008-05-21 16:28:00 · 1208 阅读 · 1 评论 -
无空间复杂度(无栈)的非递归二叉树中序遍历
常见的二叉树非递归算法都是用栈保存访问路径上的结点,这样使空间复杂为o(n),其中n为树最大深度。空间复杂度为o(1)的算法并没有以牺牲时间复杂度为代价,它只是巧妙的运用叶子结点左右孩子指针为空这一事实,将所有的叶子组成一链栈用于保存回退信息,其中叶子结点的lchild域相当于链表的data域,rchild相当于链表的next域,是一种“废物利用”的思想,本质上还是用了栈,只是没用分配栈空间而已。原创 2008-05-12 17:28:00 · 3428 阅读 · 4 评论 -
O(1)空间复杂度删除一棵二叉树
删除一棵二叉树,不能递归,不能用栈,空间复杂度必须为O(1).其思想是利用每个节点的左指针,将后序遍历中需要压入栈的节点就地连成一个链式栈。 DeleteBtree(Node* head)...{ Node *stack = NULL; No原创 2008-05-15 16:54:00 · 2071 阅读 · 1 评论 -
5个数排列所需的最少比较次数
5 个数最快的排序, H.B.Demuth 于 1956 年在他的博士论文中提出了以下方法:开始时,就像用合并对4个元素排序一样,首先比较a:b,接着 c:d,然后把每对的较大者拿来比较,这就产生了a b--d / /a c e 这时,我们把第5个元素e,插入到{a,b,d}当中的适当位置,只需比较两次,首先同b进行比较,而后同a或d进行比较,就有如图所示的四种情况 b-d原创 2008-05-13 17:33:00 · 10317 阅读 · 1 评论 -
最长单调递增子序列( O(nlgn) )
最长单调递增子序列设A是n个不同正整数构成的序列,求A的一个最长递增子序列。例如序列为1,5,3,8,10,6,4,9;它的最长递增子序列为1,5,8,10;1,5,8,9;...。 这是一道很典型的动态规划题目。设fi表示结尾元素为原序列中第i个元素的最长单调递增序列的长度(为了简便,设a0 = -∞,f0= 0),动态规划的状态转移方程如下:原创 2008-05-13 17:12:00 · 8157 阅读 · 1 评论 -
变换数组 要求空间复杂度为O(1)
原数组为a1, a2, a3,....an,b1,b2,b3...bn变换成b1, a1, b2, a2, b3, a3.....bn,an要求空间复杂度为o(1):分析清楚数组变换前后下标的对应情况即可。需要注意的是这个变换可能是若干个轮换,需要将所有的轮换都恰好处理一次。算法:TransformArray(array, n): // n是题目中的n,array的大小是原创 2008-03-09 15:51:00 · 1765 阅读 · 0 评论 -
邮票问题
邮票问题 本题取材于ICPC(世界赛)95E题【问题描述】 给定一个信封,最多只允许粘贴N(N张邮票,我们现在有m(m种邮票,面值分别为:x1,x2,…….xm分(xi为正整数),并假设各种邮票都有足够多张. 要求计算所能获得的邮资最大范围,即求最大值MAX,使在1—MAX之间的每一个邮资值都能得到. 例如:N=4,有2种邮票,面值分别为1原创 2006-08-25 21:10:00 · 5478 阅读 · 1 评论 -
奇异的病毒问题
题目源自《程序员》2001年第8期编程擂台问题描述最近出现了一种奇异的生物病毒,这种病毒侵染的范围很广,科学家们经研究发现,这种病毒的内部存在一种环状DNAD片断,而正常情况下,生物的基因总是呈线状排列的.因此据Dr.X推测,病毒侵染某个生物的几率可能正是与此有关:被侵染生物的DNA中总是或多或少存在着一些片段,它们与环状DNA片断中的一部分是相同的(可称之为 “匹配”),而它们中最长原创 2006-08-23 12:06:00 · 1887 阅读 · 1 评论 -
加分二叉树
题目描述 设一个n 个节点的二叉树T 的中序遍历为(1,2,3,...,n),其中数字 1,2,3,...,n 为节点编号。 每个节点都有一个分数(均为正整数),记第j 个节点的分数为dj。二叉树T 及它的每个子树都有 一个加分,任意一棵子树S(包括T 本身)的加分等于S 的左子树的加分×S 的右子树的加分+S的根的分数。 若某棵子树为空,规定其加分为1。叶子的原创 2008-05-28 18:48:00 · 3540 阅读 · 0 评论 -
整数的分划问题
[整数的分划问题] 对于一个正整数M的分划就是把M写成一系列正整数之和的表达式。例如,对于正整 数M=6,它可以分划为: 6 5+1 4+2, 4+1+1 3+3, 3+2+1, 3+1+1+1 2+2, 2+2+1+1, 2+1+1+1+1 1+1+1+1+1+1 注意,分划与顺序无关,例如5+1和1+5是同一种分划。另外,这个整数M本身也算 是一种分划。原创 2008-05-29 13:12:00 · 2304 阅读 · 0 评论 -
计算组合公式C(n,m)的化简
排列、组合问题是大家再熟悉不过,通过公式可以轻而易举地求出C(n, m)、P(n, m),本文将就组合问题介绍一些在时间复杂度和空间复杂度上去对程序进行优化的方法。地球人都知道C(n, m) = C(n – 1, m – 1) + C(n – 1, m),根据这个递归性质,用C++程序递归实现如下: //1.cpp#include iostream>原创 2008-05-27 13:10:00 · 24793 阅读 · 1 评论 -
大白话解析模拟退火算法
优化算法入门系列文章目录(更新中): 1.模拟退火算法 2.遗传算法一. 爬山算法 ( Hill Climbing )介绍模拟退火前,先介绍爬山算法。爬山算法是一种简单的贪心搜索算法,该算法每次从当前解的临近解空间中选择一个最优解作为当前解,直到达到一个局部最优解。爬山算法实现很简单,其主要缺点是会陷入局部最优解,而不一定能搜索到全局最优解。如图1所示:假设转载 2011-11-16 23:42:19 · 15123 阅读 · 0 评论 -
算法之道—形而之上谓之道
文 / 邹恒明1966年3月的一天,美国加州大学洛杉矶分校的Andrew J. Viterbi教授在给研究生讲解缠绕编码的时序译码算法SDCD。但不管他如何讲解,学生就是听不明白。思来想去,Viterbi觉得学生不能理解的原因是该算法的证明过于复杂。于是他开始考虑如何简化这个证明。在经历了持久的烦躁和困惑后,他灵感顿现:需要简化的不是算法的证明,而是算法本身。于是Viterbi对SDCD算法进转载 2011-10-26 09:49:53 · 3133 阅读 · 0 评论 -
由rand7生成rand10以及随机数生成方法的讨论
ZZ 毕达哥拉斯半圆问题:rand7是一个能生成1-7的整数随机数。要求利用rand7生成1-10的整数随机数。可以参看原帖。在lz提示下又找到了更简洁的方法,同余循环法,只需要一行代码!我很浅的探讨几种方法,还需要更深入的学习。感慨一下知识的浩瀚和自己的渺小。转载 2011-10-05 21:37:03 · 7062 阅读 · 3 评论 -
海量数据面试题整理
海量数据面试题整理转载 2010-08-01 13:09:00 · 6355 阅读 · 5 评论 -
尾递归与Continuation
递归与尾递归 关于递归操作,相信大家都已经不陌生。简单地说,一个函数直接或间接地调用自身,是为直接或间接递归。例如,我们可以使用递归来计算一个单向链表的长度:public class Node{ public Node(int value, Node next) { this.Value = value; this.Next =转载 2009-04-28 17:19:00 · 2042 阅读 · 0 评论 -
关于常见排序算法的稳定性分析和结论
这几天笔试了好几次了,连续碰到一个关于常见排序算法稳定性判别的问题,往往还是多选,对于我以及和我一样拿不准的同学可不是一个能轻易下结论的题目,当然如果你笔试之前已经记住了数据结构书上哪些是稳定的,哪些不是稳定的,做起来应该可以轻松搞定。本文是针对老是记不住这个或者想真正明白到底为什么是稳定或者不稳定的人准备的。 首先,排序算法的稳定性大家应该都知道,通俗地讲就是能保证排序前2个相等的数其原创 2008-10-24 21:04:00 · 1194 阅读 · 0 评论 -
两单向链表相交问题
题目: 给出两个单向链表的头指针,比如h1、h2,判断链表是否相交,如果不相交返回NULL;如果相交,返回指向第一个相交节点的指针;时间复杂度控制在O(n)的前提下。 这道题首先要弄明白的是,两单向链表相交的话,一定是Y型相交,不可能出现X型,弄清楚这点后接下来的工作就是:(1)先找到h1,h2的最后一个节点p1和p2,同时记录节点数量a,b;(2)判断最后一个节点是否相同;原创 2008-06-03 13:24:00 · 2085 阅读 · 1 评论 -
O(1)时间删除链表结点
题目:给定链表的头指针和一个结点指针,在O(1)时间删除该结点。链表结点的定义如下:struct ListNode{ int m_nKey; ListNode* m_pNext;};函数的声明如下:void DeleteNode(ListNode* pListHead, ListNode* pToBeDeleted);分析:这是一原创 2008-06-02 10:59:00 · 1517 阅读 · 2 评论 -
找出数组中两个只出现一次的数字
function StorePage(){d=document;t=d.selection?(d.selection.type!=None?d.selection.createRange().text:):(d.getSelection?d.getSelection():);void(keyit=window.open(http://www.365key.com/storei原创 2008-06-02 12:00:00 · 1830 阅读 · 1 评论 -
编程珠玑开篇2--磁盘文件排序问题再讨论
在编程珠玑开篇--磁盘文件排序问题一文中,要求输入时某个正整数不会重复出现。 如果每个整数重复出现的次数至多10次,我们应该如何修改方案呢?如果每个整数最多出现10次,那么我们就可以使用半个字节4位,统计出现的次数。相应的设置函数也应该修改: #define BITSPEREORD 8 // the type int contains 8 bit num#define SHIF原创 2008-06-01 11:44:00 · 1384 阅读 · 1 评论 -
Chopsticks
ChopsticksTime limit: 10 Seconds Memory limit: 32768K Total Submit: 1706 Accepted Submit: 746 In China, people use a pair of chopsticks to get food on the table, but Mr. L is a bit different.原创 2008-05-28 16:52:00 · 1799 阅读 · 2 评论 -
Catalan 数的应用
Wikipedia上的Catalan numbers:In combinatorial mathematics, the Catalan numbers form a sequence of natural numbers that occur in various counting problems, often involving recursively defined objects.原创 2008-05-27 11:13:00 · 2046 阅读 · 2 评论 -
计算直线的交点数
Problem Description平面上有n条直线,且无三线共点,问这些直线能有多少种不同交点数。比如,如果n=2,则可能的交点数量为0(平行)或者1(不平行)。Input输入数据包含多个测试实例,每个测试实例占一行,每行包含一个正整数n(nOutput每个测试实例对应一行输出,从小到大列出所有相交方案,其中每个数为可能的交点数,每行的整数之间用一个空格隔开。Sample Input2原创 2008-05-30 01:11:00 · 3715 阅读 · 5 评论 -
装错信封问题
组合学中有这样一个问题:某人给五个朋友写信,邀请他们来家中聚会。请柬和信封交由助手去处理。粗心的助手却把请柬全装错了信封。请问:助手会有多少种装错的可能呢?这个问题是是由当时有名的数学家约翰·伯努利(Johann Bernoulli,1667—1748)的儿子丹尼尔·伯努利(Danid Bernoulli,17OO一1782)提出来的。瑞士著名数学家欧拉按一般情况给出了一个递推公式:原创 2008-05-29 16:31:00 · 22759 阅读 · 2 评论 -
Miller_Rabin素数测试
关于素数的研究已有相当长的历史,近代密码学的研究又给它注入了新的活力.在关于素数的研究中素数的测试是一个非常重要的问题.Wilson 定理给出了一个数是素数的重要条件. Wilson 定理 对于给定的正整数 n,判定 n 是一个素数的充要条件是 (n-1)!≡ -1(mod n)Wilson 定理有很高的理论价值.但实际用于素数测试所需要计算量太大,无法实现对原创 2006-07-27 16:46:00 · 13519 阅读 · 17 评论 -
贪心策略的特点与应用
一、 贪心策略的定义 【定义1】 贪心策略是指从问题的初始状态出发,通过若干次的贪心选择而得出最优值(或较优解)的一种解题方法。 其实,从"贪心策略"一词我们便可以看出,贪心策略总是做出在当前看来是最优的选择,也就是说贪心策略并不是从整体上加以考虑,它所做出的选择只是在某种意义上的局部最优解,而许多问题自身的特性决定了该题运用贪心策略可以得到最优解或较优解。 二、贪心算法的特点原创 2006-07-25 17:47:00 · 5963 阅读 · 0 评论 -
选数(NOIP2002)
[问题描述]: 已知 n 个整数 x1,x2,…,xn,以及一个整数 k(k<n)。从 n 个整数中任选 k 个整数相加,可分别得到一系列的和。例如当 n=4,k=3,4 个整数分别为 3,7,12,19 时,可得全部的组合与它们的和为: 3+7+12=22 3+7+19=29 7+12+19=38 3+12+19=34。 现在,要求你计算出和为素数共有多少种。原创 2006-07-21 16:42:00 · 6795 阅读 · 0 评论 -
基本数据结构名词的英文翻译
Data Structures 基本数据结构 Dictionaries 字典 Priority Queues 堆 Graph Data Structures 图 Set Data Structures 集合 Kd-Trees 线段树 Numerical Problems 数值问题 Solving Linear Equations 线性方程组 Bandwidth Reduction 带宽压缩 Mat原创 2006-04-21 14:38:00 · 4367 阅读 · 0 评论 -
支付帐单问题
题目描述比尔最近遇到了一件麻烦事。每天上午,他会收到若干张帐单(也可能一张也没收到), 每一张都有一定的面额。下午,他会从目前还没有支付的帐单中选出面额最大和最小的两张,并把它们付清。还没有支付的帐单会被保留到下一天。现在比尔已经知道他每天收到帐单的数量和面额,请你帮他给出支付的顺序。输入格式第1 行:一个正整数N(N≤30,000),表示总共的天数。第2 行到第N+1 行:每一行描述原创 2006-04-21 14:33:00 · 1440 阅读 · 0 评论 -
并查集 (Union-Find Sets)及其应用
并查集 (Union-Find Sets)并查集:(union-find sets)是一种简单的用途广泛的集合. 并查集是若干个不相交集合,能够实现较快的合并和判断元素所在集合的操作,应用很多。一般采取树形结构来存储并查集,并利用一个rank数组来存储集合的深度下界,在查找操作时进行路径压缩使后续的查找操作加速。这样优化实现的并查集,空间复杂度为O(N),建立一个集合的时间复杂度为O(1),N原创 2006-08-25 11:40:00 · 12355 阅读 · 5 评论 -
算法的力量
从学生时代,我们就被告知以“编程=算法+数据结构”。然而长期以来,国内的软件开发领域过分关注企业级开发,导致了目前中国软件开发人员对于算法的基础越来越不重视,这势必影响到软件产业发展的创新动力。在国家号召“自主创新”的背景下,重提算法的意义就显得格外重要了。今天,我们可以看到一些真正的大型软件企业四处开设研究中心,类似机构并不直接生产软件产品,而是专门从事理论研究、发表论文。这些成果顺气自然地成为转载 2006-04-08 23:05:00 · 4897 阅读 · 0 评论 -
LCS问题算法
LCS问题就是求两个字符串最长公共子串的问题。解法就是用一个矩阵来记录两个字符串中所有位置的两个字符之间的匹配情况,若是匹配则为1,否则为0。然后求出对角线最长的1序列,其对应的位置就是最长匹配子串的位置.下面是字符串21232523311324和字符串312123223445的匹配矩阵,前者为X方向的,后者为Y方向的。不难找到,红色部分是最长的匹配子串。通过查找位置我们得到最长的匹配子串为:原创 2006-03-22 20:59:00 · 1769 阅读 · 1 评论 -
单链表
#ifndef Node_H #define Node_H template class Node //单链节点类{ public: Type data; Node *link; Node() : data(Type()), link(NULL) {} Node(const Type &item) : data(item), link(NULL) {} Node(const Ty转载 2006-03-19 20:51:00 · 962 阅读 · 0 评论