
算法学习心得
文章平均质量分 60
lmsnju
这个作者很懒,什么都没留下…
展开
-
简单的矩阵优化算法
对于矩阵乘法 C = A × B,通常的做法是将矩阵进行分块相乘,如下图所示: 从上图可以看出这种分块相乘总共用了8次乘法,当然对于子矩阵相乘(如A0×B0),还可以继续递归使用分块相乘。对于中小矩阵来说,很适合使用这种分块乘法,但是对于大矩阵来说,递归的次数较多,如果能减少每次分块乘法转载 2009-12-15 10:45:00 · 2835 阅读 · 0 评论 -
卡特兰数(Catalan)
问题《编程之美》第4.3节中提到了“买票找零”问题,查阅了下资料,此问题和卡特兰数 Cn有关,其定义如下:卡特兰数真是一个神奇的数字,很多组合问题的数量都和它有关系,例如: Cn= 长度为 2n的 Dyck words的数量。 Dyck words是由 n个 X和 n个 Y组成的字符串,并且从左往右数, Y的数量不超过 X,例如长度为 6的 Dyck words为: X转载 2009-12-09 15:04:00 · 344 阅读 · 0 评论 -
金山两道程序题(排列和组合)
编程 1 给定一个字符串,输出给定字符串所有的组合的函数,例如:字符串 abc 所有组合 abc acb bac b ca cab cba六种组合 编程 2 给定一个数组大小m和一个数组array m = 10; array = {1,2,3,4,5,6,7,8,9,10} 求从array中任意取得n(n 方法原型 :int getotalNum (int[]转载 2009-12-09 14:49:00 · 387 阅读 · 0 评论 -
挫算法小总结
1.递推法递推法是利用问题本身所具有的一种递推关系求问题解的一种方法。设要求问题规模为N的解,当N=1时,解或为已知,或能非常方便地得到解。能采用递推法构造算法的问题有重要的递推性质,即当得到问题规模为i-1的解后,由问题的递推性质,能从已求得的规模为1,2,…,i-1的一系列解,构造出问题规模为I的解。这样,程序可从i=0或i=1出发,重复地,由已知至i-1规模的解,通过递推,获得规模为i的解转载 2009-11-26 20:38:00 · 320 阅读 · 0 评论 -
线段树基础知识
线段树基础知识 从简单说起,线段树其实可以理解成一种特殊的二叉树。但是这种二叉树较为平衡,和静态二叉树一样,都是提前已经建立好的树形结构。针对性强,所以效率要高。这里又想到了一句题外话:动态和静态的差别。动态结构较为灵活,但是速度较慢;静态结构节省内存,速度较快。接着回到线段树上来,线段树是建立在线段的基础上,每个结点都代表了一条线段[a , b]。长度为1的线段成为元线段。非元转载 2009-11-25 22:04:00 · 531 阅读 · 0 评论 -
点树应用
在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序。一个排列中逆序的总数就称为这个排列的逆序数。逆序数为偶数的排列称为偶排列;逆序数为奇数的排列称为奇排列。如2431中,21,43,41,31是逆序,逆序数是4,为偶排列。相信对算法设计或者数据结构有一定了解的人对线段树都不会太陌生。它是能够在log(MaxLen)时间内完成线段的添加、删除、查询等转载 2009-11-25 19:53:00 · 326 阅读 · 0 评论 -
约瑟夫环问题的数学解法
无论是用链表实现还是用数组实现都有一个共同点:要模拟整个游戏过程,不仅程序写起来比较烦,而且时间复杂度高达O(nm),当n,m非常大(例如上百万,上千万)的时候,几乎是没有办法在短时间内出结果的。我们注意到原问题仅仅是要求出最后的胜利者的序号,而不是要读者模拟整个过程。因此如果要追求效率,就要打破常规,实施一点数学策略。 为了讨论方便,先把问题稍微改变一下,并不影响原意:问题描述:n个人转载 2009-11-22 16:42:00 · 975 阅读 · 0 评论 -
忘掉数据库吧
是看了这个帖子以后,觉得还是应该写点东西:http://topic.youkuaiyun.com/u/20091112/09/60cfcddf-7205-4035-a2cd-980385be3c1b.html其实发自内心地,我还是不知道自己为什么写这个东西,要说的观点对很多人(稍大规模的网站)来讲算是常识,对另一些人(传统行业MIS应用)来讲简直是谬论,但是看着一堆小朋友们在做网站的时候,特别是有点规转载 2009-11-15 19:25:00 · 492 阅读 · 0 评论 -
白话算法复杂度!
计算机中最核心的资源就是CPU与存储器,任何程序的运行都离不开二者。任何程序的运行都要进行计算,这就会消耗CPU;任何程序的运行也都需要进行数据的处理,CPU中是无法存储数据的,必须借助存储器来保存数据。如果程序的CPU消耗过大的话就会导致程序的运行时间变长;如果占用的存储空间太大的话就会使得系统能够运行的程序数量变少。因此如何保证程序占用的CPU和占用的存储空间都较小就成了我们研究的一个重点,任转载 2009-11-11 22:44:00 · 369 阅读 · 0 评论 -
时分秒针重合——看似简单的面试题
问题在一天的24小时之中,时钟的时针、分针和秒针完全重合在一起的时候有几次?都分别是什么时间?你怎样算出来的?分析初看此问题觉得很简单,但是网上各种版本的答案都各不相同,那到底谁是对的呢?我们可以这样考虑——龟兔赛跑,跑得慢的针终归会被快的一圈一圈超过。那么,分别求出时针分针、分针秒针的重合时间,然后再看是否有相同。这里都不难,关键是有一个陷阱!请问大家,我说“一圈一圈超过”,转载 2009-12-09 15:02:00 · 778 阅读 · 0 评论 -
序列 ABAB对应字符串集合
问题 本题为 Google “Top Coder”850分例题。假设有这样一种字符串,它们的长度不大于 26,而且若一个这样的字符串其长度为 m ,则这个字符串必定由 a, b, c ... z中的前 m 个字母构成,同时保证每个字母出现且仅出现一次。比方说某个字符串长度为 5 ,那么它一定是由 a, b, c, d, e 这 5 个字母构成。一旦长度确定,这个字符串中有哪些字母也就确定转载 2009-12-09 15:19:00 · 564 阅读 · 0 评论 -
离散优化问题搜索框架 overview
本文概要说明基本思路,名字取得不一定恰当:)启发式搜索算法A* (可参考http://theory.stanford.edu/~amitp/GameProgramming/) 和遗传算法GA分别是精确搜索和近似搜索,两者原理完全不同。但是在研究过程中我发现,它们却有着内在的联系,如数据结构上非常相似,几乎可以一一对应,如下表:前者原理是在一棵搜索树上,通过启发函数“直捣黄龙”,并尽量“转载 2009-12-10 17:34:00 · 379 阅读 · 0 评论 -
一摞饼的排序
问题星期五的晚上,一帮同事在希格玛大厦附近的“硬盘酒吧”多喝了几杯。程序员多喝了几杯之后谈什么呢?自然是算法问题。有个同事说:"我以前在餐馆打工,顾客经常点非常多的烙饼。店里的饼大小不一,我习惯在到达顾客饭桌前,把一摞饼按照大小次序摆好——小的在上面,大的在下面。由于我一只手托着盘子,只好用另一只手,一次抓住最上面的几块饼,把它们上下颠倒个个儿,反复几次之后,这摞烙饼就排好序了。我后来想,这实转载 2009-12-10 17:18:00 · 413 阅读 · 0 评论 -
天平称球
问题 12 个球一个天平,现知道只有一个和其它的重量不同,问怎样称才能用三次就找到那个球。13 个呢?(注意此题并未说明那个球的重量是轻是重,所以需要仔细考虑)分析 初次遇到这种问题,容易分析晕,如果能够找到一种思维工具,解决起来会清晰很多。让我们从“信息”的角度来对这个问题进行分析:将球分成4 种:“黑球”、“白球”、“轻球”、“重球”:在称之前,所有球都不知道是转载 2009-12-10 17:07:00 · 408 阅读 · 0 评论 -
数组循环移位
问题设计一个算法,把一个含有N 个元素的数组循环右移K 位,要求时间复杂度为O(N)。解法一 看到这个题目,第一个想法是:如果程序中真遇到这个需求,以其去移动具体元素,不如改变数组访问方式,这样能实现O(1)的复杂度。设计一个类CircleArray,其中: List items; //用来保存给定的数组; int benchmark = 0转载 2009-12-10 17:05:00 · 1591 阅读 · 1 评论 -
动态有序集合——挑战红黑树
问题 在离散型优化问题(如路径搜索、整数规划等)中,常常需要一种能够高效管理动态有序集合的数据结构:不断加入无序的数据,实时取出有序数据(如从优到劣),并且可能频繁地需要进行筛选、删除、更新(改变元素的key)、查找等操作。 本节将介绍.Net 提供的2 个数据结构,和自行设计的2 个数据结构,并设计实验对比它们在不同情况下的性能。 首先定义一个接口IDySet,便于利转载 2009-12-10 17:46:00 · 681 阅读 · 0 评论 -
寻找最大的k 个数
问题 搜索引擎需要在大量网页中找到相关性最高的前k 个返回给用户,并且网页的权重可能会实时更新。如何解决这个问题?分析 通过“连载8:动态有序集合——挑战红黑树”实验分析可以看出,自行设计的BinHeap 拥有极高的插入速度。并且,如果网页权重更新,只需要将其“升级”或者“降级”即可。解法 在Binary Heap 中增加一个Push 重载,即可得到最大的k转载 2009-12-10 17:13:00 · 348 阅读 · 0 评论 -
字符串相似度计算
许多程序会大量使用字符串。对于不同的字符串,我们希望能够有办法判断其相似程序。我们定义一套操作方法来把两个不相同的字符串变得相同,具体的操作方法为:修改一个字符(如把“ a”替换为“ b”); 增加一个字符(如把“ abdd”变为“ aebdd”); 删除一个字符(如把“ travelling”变为“traveling”); 比如,对于“ abcdefg”和“abc转载 2009-12-10 17:04:00 · 1396 阅读 · 1 评论 -
寻找符合条件的整数(《编程之美》第2.8节)
问题 《编程之美》第2.8节:任意给定一个正整数N,求一个最小的正整数M(M >1),使得N * M 的十进制表示形式里只含有1 和0,例如:1 * 1 = 1 2 * 5 = 10 3 * 37 = 111 4 * 25 = 100 5 * 2 = 10 6 * 185 = 1,110 7 * 143 = 1,001 8 * 125 = 1,000 9 * 12,345,679转载 2009-12-09 15:26:00 · 848 阅读 · 0 评论 -
0/1背包问题
有n个物品,每个物品重量为wi, 价值为pi, 有装载重量为c的箱子,问如何进行装载是箱子中物品的总价值最大sum(pi xi), xi为0或者1,0表示不装载此货物,1表示装载次货物,约束条件为sum(wi xi)复杂度:NP1. 贪婪的方法是不不能保证最优的一般有如下三种贪婪方式,a)最大价值 b)最小重量 c)价值重量比 pi/wi2.递归解法假设f(i, j)表示1转载 2009-11-10 12:10:00 · 342 阅读 · 0 评论 -
0/1生成的概率题
from 算法导论CLRS 假设有一个过程Biased-Random,他可以返回0或者1,但返回0的概率是p,返回1的概率是1-p,利用这个过程作为子程序,请设计一个过程以1/2的概率返回0或者1To get an unbiased random bit, given only calls to BIASED-RANDOM, call BIASED-RANDOM twice. Repeat转载 2009-11-10 11:33:00 · 842 阅读 · 0 评论 -
little endian和big endian
来源:http://www.chinaunix.net/jh/23/823662.html little endian和big endian是表示计算机字节顺序的两种格式,所谓的字节顺序指的是长度跨越多个字节的数据的存放形式. 假设从地址0x00000000开始的一个字中保存有数据0x1234abcd,那么在两种不同的内存顺序的机器上从字节的角度去看的话分别表示为: 1)lit转载 2009-11-10 11:26:00 · 244 阅读 · 0 评论 -
简易音乐推荐引擎的设计!
我们在浏览音乐网站时可能发现,它会自动给你推荐一些你感兴趣的音乐。这是怎么实现的呢?其实归根到底还是你在网站上留下了你的信息起了作用。比方说:你对你听过的音乐进行了评分,系统就会根据你对音乐的评分,然后再去参考其他用户的评分,通过后台的推荐引擎把数据归一化,提取出你可能会感兴趣的音乐。在这里我们介绍下简易的音乐推荐引擎的实现思路,这个思路不光可以应用于音乐,当然也可以应用于商品,其实商品推荐的思想转载 2009-10-27 19:27:00 · 744 阅读 · 0 评论 -
随机数用法
rand()为C提供的一个伪随机函数,如果想生成n范围以内的随机数,用法是:rand() % n,但是每次程序执行时都是产生相同的随机数。rand() + srand() + time(0) 这三个函数组合可以使得程序每次执行时都产生不同的随机数结果,srand()函数需要种子,time(0)用当前的系统时间作为种子提供给srand()函数。用法:srand(time(0)); rand()原创 2009-10-28 14:08:00 · 330 阅读 · 0 评论 -
两道百度面试题
1.象搜索的输入信息是一个字符串,统计300万输入信息中的最热门的前十条,我们每次输入的一个字符串为不超过255byte,内存使用只有1G,请描述思想,写出算发(c语言),空间和时间复杂度,2.国内的一些帖吧,如baidu,有几十万个主题,假设每一个主题都有上亿的跟帖子,怎么样设计这个系统速度最好,请描述思想,写出算发(c语言),空间和时间复杂度第一题:全部存入内存也是可以的300w*255第二题转载 2009-10-27 20:02:00 · 533 阅读 · 0 评论 -
动态规划之最长递增子序列
既然已经说到了最长公共子序列,就把这个递增子序列也说了。同样的,这里subsequence表明了这样的子序列不要求是连续的。比如说有子序列{1, 9, 3, 8, 11, 4, 5, 6, 4, 19, 7, 1, 7 }这样一个字符串的的最长递增子序列就是{1,3,4,5,6,7}或者{1,3,4,5,6,19}。其实这个问题和前面的最长公共子序列问题还是有一定的关联的。假设我们的初始的序列转载 2009-11-03 12:05:00 · 353 阅读 · 0 评论 -
递归算法的非递归实现!
众所周知,递归算法简单易懂,而且比较容易实现,而相应的非递归算法则比较难实现。但是在用非递归算法实现递归算法时,有一个比较通用的思路,因为递归算法要求额外的辅助空间,如果能够巧妙的预先将这些空间开辟出来,这样就可以很方便的用非递归算法实现。一般情况下都是用栈或者队列来作为辅助措施实现递归算法的非递归实现。而且压栈的过程和递归的过程是对应的原创 2009-10-26 10:49:00 · 516 阅读 · 0 评论 -
快速排序的实现
非递归的方式实现快速排序 前段看到过一个问题(忘记在哪里了),用非递归的方式实现快速排序,今天又翻了出来,把代码贴上,给自己以后留个参考,代码中包括自己当时对程序改进的过程,请大家多提意见。#include "stdafx.h"#include #include #define MAX_SIZE 10using namespace std;原创 2009-10-26 11:35:00 · 241 阅读 · 0 评论 -
a和b交换值的位运算实现!
实现如下: a^=b; b^=a; a^=b;原创 2009-10-26 11:07:00 · 491 阅读 · 0 评论 -
八种排序算法
插入排序1.直接插入排序原理:将数组分为无序区和有序区两个区,然后不断将无序区的第一个元素按大小顺序插入到有序区中去,最终将所有无序区元素都移动到有序区完成排序。要点:设立哨兵,作为临时存储和判断数组边界之用。实现:Void InsertSort(Node L[],int length){Int i,j;//分别为有序区和无序区指针for(i=1;i转载 2009-10-21 12:35:00 · 275 阅读 · 0 评论 -
几道海量数据处理的算法题!
1、有1亿个浮点数,请找出其中对大的10000个。提示:假设每个浮点数占4个字节,1亿个浮点数就要站到相当大的空间,因此不能一次将全部读入内存进行排序。2、有一篇英文文章(也就是说每个单词之间由空格分隔),请找出“csdn”着个单词出现的次数,要求效率最高,并写出算法的时间级。3.假设有1kw个身份证号,以及他们对应的数据。身份证号可能重复,要求找出出现次数最多的身份证号。4.百度每天都会接受数亿转载 2009-10-27 19:52:00 · 1745 阅读 · 1 评论 -
百度在线笔试2
一、 算法&程序设计 1、打魔兽DOTA,选英雄,M个英雄围成一圈供玩家选择,天灾军团和近卫军团交替,一边选一个,直至选完(为保证两边人数相等,M是偶数)。为了增加趣味性,制定选英雄规则如下: 按照顺时针方向,两队一边选一个(选英雄不区分阵营),选中的英雄会消失,不参与下一轮选择。强制规定每次选择英雄,都只能选择与最后被选走英雄顺时针相隔两个人的英雄。 你是一个具有高转载 2009-11-07 16:23:00 · 604 阅读 · 0 评论 -
P NP NPC
基本概念优化问题: 构造一个解来最大化或最小化某个目标方程。 决策问题: 一个具有两个答案的问题。举例:哈密尔顿回路,一个给定的无向图是否存在哈密尔顿回路?许多问题都同时包含这两个版本: 货郎担问题优化问题: 给定加权的无向图,找一条具有最小权重和的哈密尔顿回路 决策问题: 给定一个加权无向图和整数K,问是否存在一条哈密尔顿回路的权重和不大于K背包问题假设我们有转载 2009-11-10 12:10:00 · 550 阅读 · 0 评论 -
全排列算法
考虑集合S={x1,x2,x3,....,xn}求S的全排列perm(S)perm(S)=sum xi#perm(s-xi) 这里的#表示将xi置于全排列的perm(s-xi)的前面也就是说S的全排列等价于去掉其中某个元素的全排列拼接这个元素的所有情况的和。写成C++代码如下void doPerm(int a[], int i, int len) { if(i>=le转载 2009-11-10 11:31:00 · 231 阅读 · 0 评论 -
几道面试题目
1. n个数中找出最大最小需要比较多少次,找出第一大第二大最少需要多少次?a. 找最大最少需要n-1次,这个比较好理解,考虑任意两个元素之间的比较,较小的记输一场。那么在获取最大值之后,其他元素必然至少输一场这种比较,也就是说n-1次比较时不能再少的了。简单的冒泡一遍就是n-1次。b. 考虑如下构造竞赛数,将那n个数两辆比较(假设n=2^k),比较一次后胜出的n/2个元素中包含最大值,而其转载 2009-11-10 11:24:00 · 390 阅读 · 0 评论 -
c位相量操作
转载 2009-11-01 16:41:00 · 406 阅读 · 0 评论 -
最长公共子序列
最长公共子序列,英文缩写为LCS(Longest Common Subsequence)。其定义是,一个数列 S ,如果分别是两个或多个已知数列的子序列,且是所有符合此条件序列中最长的,则 S 称为已知序列的最长公共子序列。 动态规划的一个计算最长公共子序列的方法如下: 以两个序列 X、Y 为例子: 设有二维数组 f[i][j] 表示 X 的 i 位和 Y 的 j 位之前的最长公转载 2009-11-03 11:00:00 · 355 阅读 · 0 评论 -
C++Map
STL中的set,map的内部数据结构都是用平衡树来实现的,set可以看做是一种特殊的Map,即set的key=value。map不允许出现重复的建,而且根据键值来进行排序,在访问元素是应该通过键值来访问,如果通过value性能会很差,而且不能更改key的值,但是value的值可以更改。因而可以将一个字符串作为一个键来用原创 2009-11-02 14:35:00 · 2203 阅读 · 0 评论 -
百度在线笔试题1
第一部分、算法与程序设计 1.在一棵一般的二叉树中找到指定的元素,如果有重复出现的元素,要求元素为深度最深的任何一个。指定元素找不到时返回EMPTY_NODE,请用C语言实现,相关数据结构与函数声明如下: struct Node { int iValue; int id; Node *pLeft; Node *pRight; }; const Nod转载 2009-11-07 13:27:00 · 889 阅读 · 0 评论 -
海量数据求中位数
题目描述:若有很大一组数据,数据的个数是N(每个数占4个字节),内存大小为M个字节,其中M转一道网上类似题目的解答: 题目:在一个文件中有 10G 个整数,乱序排列,要求找出中位数。内存限制为 2G。只写出思路即可(内存限制为 2G的意思就是,可以使用2G的空间来运行程序,而不考虑这台机器上的其他软件的占用内存)。 关于中位数:数据排序后,位置在最中间的数值。即将数据分成两部分,一部分转载 2009-11-01 16:34:00 · 2733 阅读 · 4 评论