
程序算法艺术与实践
文章平均质量分 89
通过对程序算法艺术(设计与分析)基础理论、最新国外的方法和各种应用,即:分治策略、动态规划DP、算法分析与问题计算复杂度、NP完全性,随机算法、模拟退火算法、量子算法等基本概念和算法进行学习与实践。
松子茶
关注数字图像处理,数据隐藏与信息隐藏,计算机视觉和机器学习...(欢迎关注微信公众号ID:songzitea)
展开
-
贪心法
贪心法又称贪婪法, 在对问题求解时,总是做出在当前看来是最好的选择,或者说是:总是作出在当前看来最好的选择。也就是说贪心算法并不从整体最优考虑,它所作出的选择只是在某种意义上的局部最优选择。原创 2016-11-28 14:20:25 · 4617 阅读 · 0 评论 -
动态规划
动态规划(DP)[1]通过分解成子问题解决了给定复杂的问题,并存储子问题的结果,以避免再次计算相同的结果。我们通过下面这个问题来说明这两个重要属性:重叠子问题和最优子结构。原创 2016-10-28 17:01:50 · 4045 阅读 · 1 评论 -
分治策略Divide and Conquer
对于一个规模为n的问题,若该问题可以容易地解决(比如说规模n较小)则直接解决,否则将其分解为k个规模较小的子问题,这些子问题互相独立且与原问题形式相同,递归地解这些子问题,然后将各子问题的解合并得到原问题的解.关于程序算法艺术与实践更多讨论与交流,敬请关注本博客和新浪微博songzi_tea.原创 2016-08-21 15:35:16 · 5784 阅读 · 0 评论 -
找出3的最大倍数的整数集合
题目描述:给一个包含非负整数的数组(长度为n),找出由这些数字组成的最大的3的倍数,没有的话则输出impossible。 例如,如果输入的数组为{8,1,9},输出应为“9 8 1”,并且如果输入的数组为{8,1,7,6,0},输出应为”8760″。关于程序算法艺术与实践更多讨论与交流,敬请关注本博客和新浪微博songzi_tea.原创 2016-08-20 22:00:22 · 3455 阅读 · 0 评论 -
深入解析快速排序(Quick Sort)
快速排序是由图灵奖获得者、计算机语言设计大佬C. A. R. Hoare在他26岁时提出的。说起C. A. R. Hoare老爷爷,可能很多人的第一印象就是快速排序,但是快排仅仅是他人生中非常小的成就而已。例如,他在1978年提出的Communicating Sequential Processes(CSP)理论,则深深的影响了并行程序设计,Go语言中的Goroutine就是这种典范。原创 2016-08-10 14:03:16 · 6048 阅读 · 1 评论 -
Bloom Filter原理
Google的爬虫每天需要抓取大量的网页。于是就有一个问题:每当爬虫分析出一个url的时候,是抓呢,还是不抓呢?如何知道这个url已经爬过了?关于程序算法艺术与实践更多讨论与交流,敬请关注本博客和新浪微博songzi_tea.原创 2016-08-09 11:05:35 · 1839 阅读 · 0 评论 -
Complexities
This webpage covers the space and time Big-O complexities of common algorithms used in Computer Science. When preparing for technical interviews in the past, I found myself spending hours crawling the internet原创 2016-08-08 22:35:59 · 2127 阅读 · 0 评论 -
逻辑与图灵机
计算无处不在。走进一个机房,在服务器排成的一道道墙之间,听着风扇的鼓噪,似乎能嗅出0和1在CPU和内存之间不间断的流动。从算筹算盘,到今天的计算机,我们用作计算的工具终于开始量到质的飞跃。计算机能做的事情越来越多,甚至超越了它们的制造者。上个世纪末,深蓝凭借前所未有的搜索和判断棋局的能力,成为第一台战胜人类国际象棋世界冠军的计算机,但它的胜利仍然仰仗于人类大师赋予的丰富国际象棋知识;而仅仅十余年后原创 2016-03-25 09:35:08 · 1935 阅读 · 0 评论 -
关于 AlphaGo 论文的阅读笔记
Deepmind 公司在 Nature 杂志发表论文 Mastering the game of Go with deep neural networks and tree search,介绍了 AlphaGo 程序的细节。本文是对这篇论文的阅读笔记。AlphaGo 神经网络构成AlphaGo 总体上由两个神经网络构成,以下我把它们简单称为「两个大脑」,这并非原文中原创 2016-03-12 10:20:39 · 6967 阅读 · 0 评论 -
图灵测试,测的到底是什么?
2014年6月7日发生了一件事情:聊天程序“尤金·古斯特曼”(Eugene Goostman)在英国皇家学会举行的2014图灵测试大会上冒充一个13岁乌克兰男孩而骗过了33%的评委,从而按照图灵当初的定义,“通过”了图灵测试。尤金的在线对话页面,不幸的是因为这一事件给服务器带来的压力,该网站已经几天无法访问了……但是,通过了测试又怎么样呢?说明了什么问题呢?原创 2016-03-20 17:11:12 · 9306 阅读 · 0 评论 -
PrincetonUniversity-Coursera 算法:算法简介
Course OverviewWhat is this course?Intermediate-level survey course.Programming and proble solving,with applicationsAlgorithm:method for solving a problemData struvture: method to stroe informationWhy原创 2016-02-13 11:56:23 · 2132 阅读 · 0 评论 -
螺旋矩阵、螺旋队列算法
问题描述螺旋矩阵是一个nxn的方阵,其中元素为自然数,但像螺旋方向一样递增。举例如下:若n = 3,螺旋矩阵为:1 2 38 9 47 6 5若n = 4,螺旋矩阵为: 1 2 3 412 13 14 511 16 15 610 9 8 7若n = 5,螺旋矩阵是: 1 2 3原创 2012-12-30 19:56:55 · 16560 阅读 · 1 评论 -
程序算法艺术与实践:递归策略之递归,循环与迭代
众所周知,递归的实现是通过调用函数本身,函数调用的时候,每次调用时要做地址保存,参数传递等,这是通过一个递归工作栈实现的,同时影响效率的。递归是利用系统的堆栈保存函数当中的局部变量来解决问题的。递归就是在栈处理栈上一堆的指针指向内存中的对象,这些对象一直不被释放,直到递归执行到最后一次后,才释放空间.关于程序算法艺术与实践更多讨论与交流,敬请关注本博客和新浪微博songzi_tea.原创 2015-09-24 08:40:55 · 2960 阅读 · 0 评论 -
程序算法艺术与实践:递归策略基本的思想
分治策略(Divide and Conquer)是一种常用的算法技术,使用分治策略设计的算法通常是递归算法.很多时候我们看明白一个复杂的递归都有点费时间,尤其对模型所描述的问题概念不清的时候,想要自己设计一个递归那么就更是有难度了。如果递归仅仅是循环,估计现在我们就看不到递归了。递归之所以现在还存在是因为递归可以产生无限循环体.用归纳法来理解递归数学都不差的我们,第一反应就是递归在数学上的模型是什原创 2015-09-20 21:04:54 · 1873 阅读 · 1 评论 -
旋转交换或向量旋转
问题描述 (来源于《编程珠玑》第2版的第2章第11页问题B)请将一个具有n个元素的一维向量向左旋转i个位置。例如,假设n=8,i=3,那么向量abcdefgh旋转之后得到向量defghabc。简单编码使用一个具有n个元素的中间向量分n步即可完成此作业。你可以仅使用几十字节的微小内存,花费与n成比例的时间来旋转该向量吗?解决思路 方案一: 将向量x中的前i个元素复制到一个临时原创 2013-04-06 00:28:27 · 2109 阅读 · 0 评论 -
块变换(字符反转)
问题描述前面有两节提供了不同方法解决关于将一个具有n个元素的一维向量向左旋转i个位置。即:旋转交换和Juggling算法。本节,提出另一种方案,块变换解决此问题。(来源于《编程珠玑》第2版的第2章第11页问题B)请将一个具有n个元素的一维向量向左旋转i个位置。例如,假设n=8,i=3,那么向量abcdefgh旋转之后得到向量defghabc。简单编码使用一个具有n个元素的中间向原创 2013-04-11 20:18:55 · 2059 阅读 · 0 评论 -
快速排序
在编程珠玑一书对快速排序讲得较为透彻,最早的快排是单向的,慢慢演化成双向的,也就是目前的版本。从此书能看到这种演化的必要性。我想在这里,对其原理搞懂了就不会忘了(^_^)。快速排序思想1962年,由C.A.R.Hoare创造出来。该算法核心思想就一句话:“排序数组时,将数组分成两个小部分,然后对它们递归排序”。然而采取什么样的策略将数组分成两个部分是关键,想想看,如果随便将数组A分成A原创 2013-04-14 22:17:12 · 2091 阅读 · 0 评论 -
插入排序
插入排序的精髓就是首先将第一个元素视为有序子数组x[0...0],然后插入x[1]...x[n-1].思想很简单,优化思路:内循环的swap函数可能不如内联函数快些,所以第一步优化将该swap函数展开,据作者说,展开后效率提高了60%。优化思路:由于内循环中总是给变量t赋同样的值(x[i]的初始值),所以内循环关于t的两条赋值语句移出循环,据说这么做的效率又提高了15%。插入排序的效率总是O(n2),效率差在比较的次数以及交换的频率,如果交换的频率减少的话就可以大大提高插入排序的效率,这也是为什么元素基本有原创 2013-04-20 02:09:15 · 2403 阅读 · 0 评论 -
如何优化程序打印出小于100000的素数
问题描述 从2开始到n-1都不能整除则为素数。优化从2到sqrt(n)不能整除就可以 通过对被2、3和5整除的特殊检验,避免了近3/4的开方运算,其次,只考虑奇数作为可能的因子,在剩余的数中避免了大约一半的整除检验(注意一点,2,3,5本身也是素数)(If( n%2 == 0 ) return (n==2); //能被2整除且不是2本身的不是素数)用乘法运算代替开方运算in原创 2013-04-28 22:12:38 · 2963 阅读 · 2 评论 -
堆排序的实现
堆排序(Heap Sort)堆排序(HeapSort)是一树形选择排序。堆排序的特点是:在排序过程中,将R[l..n]看成是一棵完全二叉树的顺序存储结构,利用完全二叉树中双亲结点和孩子结点之间的内在关系,在当前无序区中选择关键字最大(或最小)的记录.堆排序的最坏时间复杂度为O(nlogn)。堆序的平均性能较接近于最坏性能。由于建初始堆所需的比较次数较多,所以堆排序不适宜于记录数较少的文件。堆排原创 2013-05-25 18:47:07 · 2276 阅读 · 0 评论 -
取样问题
问题描述程序最终结果用上的输入数据只是部分(样品),若将全部输入放入内存再进行计算后取出结果,很可能会导致浪费掉大量的时间空间。输入:m和n,使 0 < m < n ( m, n均为整数)。输出:m个随机整数的有序列表。(随机整数不允许重复)方案一:使用概率计算伪代码设:bigrand()能返回一个远大于n的函数.randint(i, j)能返回一个i...j范围内均匀选择原创 2013-06-02 20:22:42 · 2214 阅读 · 0 评论 -
利用马尔可夫链生成随机文本
二阶马尔可夫链:例如:of the people, by thepeople, for the peoplePrefix(后缀数组)Suffixof the people è 比如 thepeople后面可以跟by for 空,可根据概率选择一个如果选择for,则过度到状态people for,从the people原创 2013-07-02 18:33:42 · 7655 阅读 · 0 评论 -
字典树,后缀树
Trie树,即字典树,又称单词查找树或键树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计和排序大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:最大限度地减少无谓的字符串比较,查询效率比哈希表高。Trie的核心思想是空间换时间。利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的。原创 2013-07-09 22:45:53 · 2405 阅读 · 0 评论 -
B-和B+树
B-树每个节点上包含着数据和指针,每个指针指向其一个子节点的位置, B-树的查找需要一次对每个节点进行二分查找,直至找到或返回null。通常,可以引入布朗过滤器等方式加速查找。B-树的搜索,从根结点开始,对结点内的关键字(有序)序列进行二分查找,如果命中则结束,否则进入查询关键字所属范围的儿子结点;重复,直到所对应的儿子指针为空,或已经是叶子结点(其搜索性能等价于在关键字全集内做一原创 2013-08-01 16:33:59 · 3283 阅读 · 0 评论 -
基本的排序算法原理与实现
本节主要介绍基本的排序算法 ,即:插入排序,选择排序,冒泡排序.插入排序首先考虑data中的前两个元素,即data[0]和data[1]。如果它们的次序颠倒了,就交换它们。然后,考虑第三个元素data[2],将其插入到合适的位置上。如果data[2]同时小于data[0]和data[1],那么data[0]和data[1]都要移动一个位置;data[0]放在位置1上,data[1]放在位置2上,而将data[2]放在位置0上。如果data[2]小于data[1],而不于data[0],那么只须把data[1原创 2013-08-25 18:59:32 · 3084 阅读 · 0 评论 -
Josephu 问题:数组实现和链表实现
Josephu 问题为:设编号为1,2,⋯ n的n个人围坐一圈,约定编号为k(1<=k<=n)的人从1开始报数,数到m 的那个人出列,它的下一位又从1开始报数,数到m的那个人又出列,依次类推,直到所有人出列为止,由此产生一个出队编号的序列。原创 2012-12-30 19:40:06 · 1797 阅读 · 0 评论 -
杨辉三角形算法
编写程序,打印出以下形式的扬辉三角形。杨辉三角是一个由数字排列成的三角形数表,一般形式如下: 1 1 1 1 2 1 1 3 3 1 1 4 6 4 1 1 5 10 10 5 1 ...............................原创 2012-12-30 23:44:41 · 6581 阅读 · 0 评论 -
位图排序
主要是阐述位图在排序中的使用.问题描述位图排序是一种效率极高(复杂度可达O(n))并且很节省空间的一种排序方法,但是这种排序方法对输入的数据是有比较严格的要求(数据不能重复,大致知道数据的范围)。位图排序即利用位图或者位向量来表示集合。可以说算法中用到位操作的很多,因为速度快,空间小,比如哈有bitmask dp。文中的问题可以抽象为对[1:10000000]区间内的随机排列进行排序,原创 2013-04-05 12:55:34 · 3714 阅读 · 0 评论 -
【编程珠玑】排序与位向量
问题描述 1: 如果不缺内存,如何使用一个具有库的语言来实现一种排序算法以表示和排序集合?(来源于《编程珠玑》第2版第1章中第7页习题1)分析:我们应该对题目进行分析: 1)对内存并没有什么要求;2)选择库的语言来实现;3)排序算法。若我们需要访问的是一个长度(假设n为1000000)非常大的数组,一般而言对数组中某个元素访问前我们必须要进行初始化,但是当n值非常大而程序对tim原创 2013-04-05 16:08:32 · 2333 阅读 · 0 评论 -
随机顺序的随机整数
问题描述 如何生成位于0到n-1之间的k个不同的随机顺序的随机整数?(来源于《编程珠玑》第2版的第1章中第7页习题4)方法1 在使用Random类时,每次选择不同的随机因子并在Next中划定范围。这种方法简单容易实现,看上去似乎是可以满足需求的,但我不知道怎么去证明static void GenRandoInt1(int n , int [] array, i原创 2013-04-05 16:09:22 · 2235 阅读 · 0 评论 -
产生不重复的随机数
我们在前几节,介绍了一篇三种方案解决 如何生成位于0到n-1之间的k个不同的随机顺序的随机整数? [请点击],本节则基于上述中,拓展如下所示的问题,然后,给出几个方案。问题描述产生[0, n) 范围内不重复的随机数。方案一:Knuth 的S方案有一个结论:从r中等概率的选出s个,某一个被选中的概率为s/r。证明:从r中选出s个有C(r, s)种情况,其中C(r, s)表示组合。同理原创 2013-04-05 22:19:08 · 2680 阅读 · 0 评论 -
变位词实现
问题描述(来源于《编程珠玑》第2版的第2章第11页问题 C)Given a dictionary of english words,find all sets of anagrams,For instance, “posts”,”stop”and ”tops” are all anagrams of one another because each can be formed by p原创 2013-04-06 01:03:42 · 1994 阅读 · 0 评论 -
约瑟夫环解法
问题描述设有n个人围坐一圈并按顺时针方向从1到n编号,从第s个人开始进行1到m的报数, 报数到第m个人, 此人出圈, 再从他的下一个人重新开始1到m的报数,如此进行下去直到所有的人都出圈为止。现要求按出圈次序,给出这n个人的顺序表p。请考生编制函数Josegh()实现此功能并调用函数WriteDat()把编号按照出圈的顺序输出到OUT.DAT文件中。设 n = 100, s = 1, m =原创 2013-04-07 20:44:34 · 2068 阅读 · 0 评论 -
Juggling算法
问题描述关于本节问题描述,我们在前几节已经出现,即:旋转交换的引用中问题。提出另一种方案,Juggling算法解决这个问题。(来源于《编程珠玑》第2版的第2章第11页问题B)请将一个具有n个元素的一维向量向左旋转i个位置。例如,假设n=8,i=3,那么向量abcdefgh旋转之后得到向量defghabc。简单编码使用一个具有n个元素的中间向量分n步即可完成此作业。你可以仅使用几十字节的原创 2013-04-10 17:29:56 · 2441 阅读 · 0 评论 -
程序算法艺术与实践:稀尔排序、冒泡排序和快速排序
稀尔排序://希尔排序#include #include void ShellSort( int* data, int left, int right){ int len = right-left +1; int d =len; while (d>1){ d =(d+1)/2; for(int i =left; i<right+1-d;i++){ if(原创 2012-12-30 19:32:51 · 1464 阅读 · 0 评论 -
程序算法艺术与实践:经典排序算法之桶排序
桶排序Bucket Sort从1956年就开始被使用,该算法的基本思想是由E.J.Issac R.C.Singleton提出来。本博介绍BucketSort算法相关知识。算法描述与伪代码假设输入的待排序元素是等可能的落在等间隔的值区间内.一个长度为N的数组使用桶排序, 需要长度为N的辅助数组. 等间隔的区间称为桶, 每个桶内落在该区间的元素. 桶排序是基数排序的一种归纳结果.算法的主要思想: 待原创 2015-09-19 19:27:13 · 2498 阅读 · 0 评论 -
程序算法艺术与实践:经典排序算法之插入排序
插入排序(Insertion Sort)的基本思想是每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子文件中的适当位置,直到全部记录插入完成为止。基本思想与伪代码经过j-1遍处理后,A[1..j-1]己排好序。第j遍处理仅将A[j]插入L[1..j-1]的适当位置,使得A[1..j]又是排好序的序列。要达到这个目的,我们可以用顺序比较的方法。首先比较A[j]和A[j-1],如果A[j-原创 2015-09-19 13:49:32 · 2271 阅读 · 0 评论 -
程序算法艺术与实践:递归策略之矩阵乘法问题
矩阵(Matrix)是指纵横排列的二维数据表格,最早来自于方程组的系数及常数所构成的方阵。这一概念由19世纪英国数学家凯利首先提出。 矩阵是高等代数学中的常见工具,也常见于统计分析等应用数学学科中。并且在ACM竞赛,有很多涉及到矩阵知识的题。许多算法都会结合矩阵来处理,而比较具有代表性的矩阵算法有:矩阵快速幂、高斯消元等等.关于程序算法艺术与实践更多讨论与交流,敬请关注本博客和新浪微博songzi_tea.原创 2015-09-16 22:10:38 · 4328 阅读 · 1 评论 -
程序算法艺术与实践:递归策略之Fibonacci数列
Fibonacci数列的数学表达式F(n) = F(n-1) + F(n-2),F(1) = 1 ,F(2) = 1函数fib会等待好久,其它的都能很快得出结果,由于我的程序都没有涉及到高精度,所以要是求大数据的话,可以通过取模来获得结果的后4位来测试效率与正确性。另外斐波那契数列在实际工作中应该用的很少,尤其是当数据n很大的时候,所以综合考虑基本普通的非递归O(n)方法就很好了,没有必要用矩阵乘法。.关于程序算法艺术与实践更多讨论与交流,敬请关注本博客和新浪微博songzi_tea.原创 2015-09-16 18:08:04 · 1951 阅读 · 1 评论 -
程序算法艺术与实践:基础知识之函数的渐近的界
众所周知,算法所需的时间应当是随着其输入规模增长的,而输入规模与特定具体问题有关。对大多数问题来说其最自然的度量就是输入中的元素个数。算法的运行时间是指在特定输入时所执行的基本操作数。我们可以得到关于一个关于输入规模n的所需时间的函数。然而可以进一步简化算法的时间分析,我们进行进一步抽象,首先,忽略每条语句的真实代价,通过运行时间的增长率来度量一个算法在时间方面的表现。我们只考虑公式的最高次项,并原创 2015-09-07 21:11:59 · 4495 阅读 · 3 评论