
算法与应用点拨笔记
文章平均质量分 89
onehao
这个作者很懒,什么都没留下…
展开
-
Bit Count: Parallel Counting - MIT HAKMEM
Q: Find the number of set bits in a given integer Sol: Parallel Counting: MIT HAKMEM Count HAKMEM (Hacks Memo) is a legendary collection of neat mathematical and programming hacks contributed mos转载 2013-01-21 13:29:12 · 590 阅读 · 0 评论 -
Dijkstra 算法
如下图,设A为源点,求A到其他各所有一一顶点(B、C、D、E、F)的最短路径。线上所标注为相邻线段之间的距离,即权值。 (注:此图为随意所画,其相邻顶点间的距离与图中的目视长度不能一一对等) Dijkstra无向图 算法执行步骤如下表: DIJKSTRA(G, w, s)原创 2013-07-09 11:06:23 · 750 阅读 · 0 评论 -
二叉树 Binary Tree
在计算机科学中,二叉树是每个节点最多有两个子树的树结构。通常子树被称作“左子树”(left subtree)和“右子树”(right subtree)。二叉树常被用于实现二叉查找树和二叉堆。 树和二叉树的三个主要差别: 树的结点个数至少为1,而二叉树的结点个数可以为0;树中结点的最大度数没有限制,而二叉树结点的最大度数为2;树的结点无左、右之分,而二叉树的结点有左、原创 2013-07-08 13:10:38 · 621 阅读 · 0 评论 -
树的遍历 Tranversal
对于二叉树,树的遍历通常有四种:先序遍历、中序遍历、后序遍历、广度优先遍历。(前三种亦统称深度优先遍历)对于多叉树,树的遍历通常有两种:深度优先遍历、广度优先遍历。 深度优先遍历 以下均是用递归方法 先序遍历 指先访问根,然后访问孩子的遍历方式,其C代码如下: void XXBL(tree* root){ //Do Something with原创 2013-07-08 13:11:50 · 584 阅读 · 0 评论 -
拓扑排序
拓扑排序是对有向无环图的一种排序。表示了顶点按边的方向出现的先后顺序。如果有环,则无法表示两个顶点的先后顺序。 在现实生活中,也会有不少应用例子,比如学校课程布置图,要先修完一些基础课,才可以继续修专业课。 一个简单的求拓扑排序的算法:首先要找到任意入度为0的一个顶点,删除它及所有相邻的边,再找入度为0的顶点,以此类推,直到删除所有顶点。顶点的删除顺序即为拓扑排序。 很容原创 2013-07-08 13:17:18 · 539 阅读 · 0 评论 -
斐波那契堆(Fibonacci heap)
斐波那契堆(Fibonacci heap)是计算机科学中最小堆有序树的集合。它和二项式堆有类似的性质,可用于实现合并优先队列。 不涉及删除元素的操作有O(1)的平摊时间。 Extract-Min和Delete的数目和其它相比,较小时效率更佳。 稠密图每次Decrease-key只要O(1)的平摊时间,和二项堆的O(lgn)相比是巨大的改进。 应用: 最小生成树, 单元最短原创 2013-07-09 11:04:59 · 1022 阅读 · 0 评论 -
BinarySearch 二分查找
复杂度分析 时间复杂度 二分搜索每次把搜索区域砍掉一半,很明显时间复杂度为。(n代表集合中元素的个数) 空间复杂度 。虽以递归形式定义,但是尾递归,可改写为循环。 应用 除直接在一个数组中查找元素外,可用在插入排序中。 //二分查找V0.1实现版 //copyright@2011 July //随时欢迎读者找bug,email:zhoulei090原创 2013-07-08 13:00:50 · 655 阅读 · 0 评论 -
归并排序(Merge sort,台湾译作:合并排序)
归并排序(Merge sort,台湾译作:合并排序)是建立在归并操作上的一种有效的排序算法。该算法是采用分治法(Divide and Conquer)的一个非常典型的应用 归并排序 一个归并排序的例子:对一个随机点的链表进行排序 分类 排序算法 数据结构 数组 最差时间复杂度原创 2013-07-08 13:05:34 · 798 阅读 · 0 评论 -
AVL树
在计算机科学中,AVL树是最先发明的自平衡二叉查找树。在AVL树中任何节点的两个子树的高度最大差别为一,所以它也被称为高度平衡树。查找、插入和删除在平均和最坏情况下都是O(log n)。增加和删除可能需要通过一次或多次树旋转来重新平衡这个树。AVL树得名于它的发明者G.M. Adelson-Velsky和E.M. Landis,他们在1962年的论文《An algorithm for th原创 2013-07-08 13:12:49 · 520 阅读 · 0 评论 -
红黑树 RBT (Red Black Tree)
红黑树是一种自平衡二叉查找树,是在计算机科学中用到的一种数据结构,典型的用途是实现关联数组。它是在1972年由鲁道夫·贝尔发明的,他称之为"对称二叉B树",它现代的名字是在 Leo J. Guibas 和 Robert Sedgewick 于1978年写的一篇论文中获得的。它是复杂的,但它的操作有着良好的最坏情况运行时间,并且在实践中是高效的: 它可以在O(log n)时间内做查找,插原创 2013-07-08 13:13:22 · 680 阅读 · 0 评论 -
线程与进程 深入剖析与点拨
本文旨在介绍线程与进程的差别,如有理解不当,请不吝指教。 1. 什么是进程? 进程就是一个正在执行的程序的实例,包括程序计数器,寄存器和变量的当前值。 进程用于把资源集中在一起, 多个进程共享物理内存,磁盘,打印机和其他资源。 2. 引入线程的目的:实现并行实体共享同一个地址空间和所有可用数据的能力。换句话说在同一个进程中所有的线程共享地址空间,由于线程只拥有寄存器原创 2013-07-09 15:03:57 · 806 阅读 · 0 评论 -
微软、谷歌、百度等公司经典面试100题[第101-160题]
全新整理:微软、谷歌、百度等公司经典面试100题[第101-160题] 整理:July、二零一一年三月九日。 应网友承诺与要求,全新整理。转载,请注明出处。 博主说明: 此100题V0.2版,本人不再保证,还会提供答案。 因为之前整理的微软100题,已经基本上,把题目都出尽了。见谅。 --------------------------------------------转载 2013-07-13 21:41:36 · 862 阅读 · 0 评论 -
谷歌面试题:给定能随机生成整数1到5的函数,写出能随机生成整数1到7的函数
已知一个函数f可以等概率的得到1-5间的随机数,问怎么等概率的得到1-7的随机数 int rand7() { int a; while( (a=rand5()*5+rand5()) > 26 ); return (a-3)/3; } 算法思路是: 1. 通过 rand5()*5+rand5() 产生 6 7 8 9 10 11 …… 26,27 28 29 30 这25个数转载 2013-07-13 21:31:36 · 729 阅读 · 0 评论 -
逆序数的几种求法
求一个数列的逆序数 逆序对:数列a[1],a[2],a[3]…中的任意两个数a[i],a[j] (i,如果a[i]>a[j],那么我们就说这两个数构成了一个逆序对 逆序数:一个数列中逆序对的总数 如数列 3 5 4 8 2 6 9 (5,4)是一个逆序对,同样还有(3,2),(5,2),(4,2)等等 那么如何求得一个数列的逆序数呢? 方法1:一个一个的数转载 2014-05-14 23:24:03 · 757 阅读 · 0 评论 -
【hackerrank】Insertion Sort Advanced Analysis
问题 ORTree,红黑树 Insertion Sort is a simple sorting technique which was covered in previous challenges. Sometimes, arrays may be too large for us to wait around for insertion sort to finish. Is there some other wa原创 2014-05-14 23:28:16 · 881 阅读 · 0 评论 -
B树、B+树、B*树, R树
出处:http://blog.youkuaiyun.com/v_JULY_v 。 第一节、B树、B+树、B*树 1.前言: 动态查找树主要有:二叉查找树(Binary Search Tree),平衡二叉查找树(Balanced Binary Search Tree),红黑树(Red-Black Tree ),B-tree/B+-tree/ B*-tree (B~Tree)。前转载 2013-07-09 11:04:33 · 672 阅读 · 0 评论 -
插入排序(Insertion Sort)
插入排序(Insertion Sort)的算法描述是一种简单直观的排序算法。它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供插入空间。 插入排序 使用插入排原创 2013-07-08 13:02:52 · 731 阅读 · 0 评论 -
冒泡排序(Bubble Sort,台湾译为:泡沫排序或气泡排序)
冒泡排序(Bubble Sort,台湾译为:泡沫排序或气泡排序)是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。 冒泡排序对个项目需要O()的比较次数,且可以原地排序。尽管这个算法是最简单了解和实原创 2013-07-08 13:06:31 · 1067 阅读 · 0 评论 -
希尔排序 Shell Sort,也称递减增量排序算法
希尔排序,也称递减增量排序算法,是插入排序的一种高速而稳定的改进版本。 希尔排序是基于插入排序的以下两点性质而提出改进方法的: 插入排序在对几乎已经排好序的数据操作时, 效率高, 即可以达到线性排序的效率 但插入排序一般来说是低效的, 因为插入排序每次只能将数据移动一位 希尔排序 Shellsort with gaps 23, 10, 4,原创 2013-07-08 13:07:33 · 806 阅读 · 0 评论 -
二叉查找树(Binary Search Tree)
二叉查找树(Binary Search Tree),或者是一棵空树,或者是具有下列性质的二叉树: 若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;它的左、右子树也分别为二叉排序树。 3层二叉查找树 二叉排序树的查找过程和次优二叉树类似,通常采取二叉链表作为二叉排原创 2013-07-08 13:12:20 · 833 阅读 · 0 评论 -
搜索引擎技术之概要预览
EverNote 笔记忘了出自哪里了, 故注明为转 1、什么是搜索引擎 2、网络蜘蛛 网络蜘蛛一般有两种策略:广度优先和深度优先(如下图所示) 3、中文分词 现有的分词算法可分为三大类:基于字符串匹配的分词方法、基于理解的分词方法和基于统计的分词方法。 1、基于字符串匹配的分词方法 1)正向最大匹配法(转载 2013-07-08 13:15:43 · 579 阅读 · 0 评论 -
贪心法( Greedy algorithm),又称贪心算法
贪心法( Greedy algorithm),又称贪心算法,是一种在每一步选择中都采取在当前状态下最好或最优(即最有利)的选择,从而希望导致结果是最好或最优的算法。比如在旅行推销员问题中,如果旅行员每次都选择最近的城市,那这就是一种贪心算法。 贪心算法在有最优子结构的问题中尤为有效。最优子结构的意思是局部最优解能决定全局最优解。简单地说,问题能够分解成子问题来解决,子问题的最优解能递推到最终原创 2013-07-09 11:02:59 · 1469 阅读 · 0 评论 -
字符串匹配 KMP算法
from Introduction to Algorithm KMP-MATCHER(T,P) n = T.length m = P.length pi = COMPUTE-PREFIX-FUNCTION(P) for i = 1 to n while q>0 and P[q+1] != T[i] q = pi[q] if P[q+1] == T[i] q原创 2013-07-09 11:06:50 · 839 阅读 · 0 评论 -
Quick Sort 快速排序
分类 排序算法 数据结构 不定 最差时间复杂度 最优时间复杂度 平均时间复杂度 最差空间复杂度 根据实现的方式不同而不同 最佳算法 有时是 算法 快速排序采用一种“分而治之、各个击破”的观念。 快速排序使用分治原创 2013-07-08 13:02:05 · 748 阅读 · 0 评论 -
选择排序(Selection sort)
选择排序(Selection sort)是一种简单直观的排序算法。它的工作原理如下。首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。 选择排序的主要优点与数据移动有关。如果某个元素位于正确的最终位置上,则它不会被移动。选择排序每次交换一对元素,它们当中至少有一个将被移原创 2013-07-08 13:06:06 · 702 阅读 · 0 评论 -
堆排序(Heapsort)
堆排序(Heapsort)是指利用堆积这种数据结构所设计的一种排序算法。堆积是一个近似完满二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。 堆排序 分类 排序算法 数据结构 数组 最差时间复杂度 最优时间复杂度 [1] 平均时间复杂度 最差空间复杂度原创 2013-07-08 13:08:51 · 658 阅读 · 0 评论 -
鸡尾酒排序,也就是定向冒泡排序, 鸡尾酒搅拌排序, 搅拌排序
鸡尾酒排序,也就是定向冒泡排序, 鸡尾酒搅拌排序, 搅拌排序 (也可以视作选择排序的一种变形), 涟漪排序, 来回排序 or 快乐小时排序, 是冒泡排序的一种变形。此算法与冒泡排序的不同处在于排序时是以双向在序列中进行排序。 鸡尾酒排序 使用鸡尾酒排序为一列数字进行排序的过程 分类 排序算法 数据结构 数组 最差时间复杂度原创 2013-07-08 13:10:08 · 905 阅读 · 0 评论 -
广度优先搜索算法(Breadth-First-Search)
广度优先搜索算法(Breadth-First-Search),又译作宽度优先搜索,或横向优先搜索,简称BFS,是一种图形搜索算法。简单的说,BFS是从根节点开始,沿着树的宽度遍历树的节点。如果所有节点均被访问,则算法中止。广度优先搜索的实现一般采用open-closed表。 广度优先搜索 节点进行广度优先搜索的顺序 概况原创 2013-07-08 13:16:35 · 1696 阅读 · 0 评论 -
深度优先搜索算法(Depth-First-Search)
图的深度优先遍历.swf 36.6 KB 深度优先搜索算法(Depth-First-Search),是搜索算法的 一种。是沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所有边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进 行到已发现从源节点可达的所有节点为止。如果还存在未被发现的节点,则选择其中一个作为源节点并重复以上过程,整个进程反复进行原创 2013-07-08 13:16:57 · 1542 阅读 · 0 评论 -
动态规划 LCS
概述 动态规划在查找有很多重叠子问题的情况的最优解时有效。它将问题重新组合成子问题。为了避免多次解决这些子问题,它们的结果都逐渐被计算并被保存,从简单的问题直到整个问题都被解决。因此,动态规划保存递归时的结果,因而不会在解决同样的问题时花费时间。 动态规划只能应用于有最优子结构的问题。最优子结构的意思是局部最优解能决定全局最优解(对有些问题这个要求并不能完全满足,故有时需要引入一定的近原创 2013-07-09 11:02:18 · 755 阅读 · 0 评论 -
[HackerRank]Gem Stones
Gem Stones John 发现了很多种岩石。每种岩石都有一个独一无二成分:由小写英文字母组成。宝石是由一个单一的字符组成,并且将在所有岩石中出现。 给出一些岩石的成分,输出有多少种不同的宝石存在。 输入格式 第一行包含一个整数 N, 代表岩石的个数 接下来的N行,每行包含岩石的构成,由小写的英文字母组成。 输出格式 输出有多少种不同的宝石 数据范围 1 ≤ N ≤ 100 1 ≤ 代表岩石组原创 2014-05-20 11:30:20 · 740 阅读 · 0 评论