Algorithm
fourye007
Work for fun, Live for love
展开
-
八大排序
概述排序主要内部排序和外部排序,即将一个未有序的一组数组,使之成为有序的一组数据。其中内部排序指待排序的记录放在计算机随机存储器中进行的排序过程;而外部排序指待排序的的记录数量很大,以致于内存一次不能容纳全部的记录,在排序过程中尚需对外存进行访问的排序过程。[1]内部排序常用的主要要有8种,分为5类,即如下图:[2]1. 插入排序核心思想:将未排序的元素插入一个已经有序的数组中去,使得整个数组变得...原创 2017-01-17 11:16:09 · 543 阅读 · 1 评论 -
Tire-Tree(前缀树,字典树)
在计算机科学中,trie,又称前缀树或字典树,是一种有序树,用于保存关联数组,其中的键通常是字符串。与二叉查找树不同,键不是直接保存在节点中,而是由节点在树中的位置决定。一个节点的所有子孙都有相同的前缀,也就是这个节点对应的字符串,而根节点对应空字符串。一般情况下,不是所有的节点都有对应的值,只有叶子节点和部分内部节点所对应的键才有相关的值。 Trie这个术语来自于retrieval。原创 2017-08-17 13:28:21 · 4105 阅读 · 0 评论 -
第k小元素(顺序统计量)
在一个含有n个元素的集合中,有时我们需要找到第该集合中第kk个小的元素,这也被称作第kk个顺序统计量(order statistic)。在前面我们已学过排序, 我们可以将集合进行排序后,直接输出第kk个元素。但是我们目前我们知道的排序中最好的时间复杂度就是O(nlog(n))O(nlog(n)). 接下来我们要使用两种方法找出第k小元素,其在某些过程用到排序,但我们并不会对整个集合进行排序,也不会使原创 2017-04-04 11:49:00 · 1777 阅读 · 0 评论 -
平摊分析(Amortized analysis)
今天我们主要讨论所谓的平摊分析(amortized analysis),它是用来分析一系列操作的平均所需要的代价。可能有人会问它利用概率论的知识,通过概率来求平均情况。答案是否定的,它并不涉及概率。在一些情况下平摊分析能够很好的帮助我们分析我们程序的代价或者消耗。原创 2017-03-17 11:06:37 · 1966 阅读 · 0 评论 -
散列表(Hash Table)
散列表也称作为哈希表,它是一个动态表,然而它支持字典的操作,因为它的存储一个值,需要相应的键。在查找一个值时,也需要一个键。最基本的操作就是:insert, search以及delete。散列表作为一个动态表,它的性能表现的异常好。甚至在合理的假设条件下,它的操作只需要O(1)O(1)的代价。原创 2017-03-20 11:04:38 · 338 阅读 · 0 评论 -
斐波那契堆(Fibonacci Heap)
也许我们每个人都知道斐波那契数列(Fibonacci sequence)。即这样一个数列:1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144...,如果我们用伪代码比表示:int FibonacciSequence(int n){ if (n == 1 || n == 2) { return 1; } return原创 2017-03-08 10:38:25 · 3705 阅读 · 0 评论 -
红黑树(Red Black Tree)
1. 概述一棵二叉树如果满足下面的红黑性质,则为一棵红黑树[1]:1)每个节点或是红的,或是黑的2)根节点是黑的3)每个叶节点(NIL)是黑的。4)如果一个节点是红的,则它的儿子都是黑的5)对每个节点,从该节点到其子孙节点的所有路径包含相同数目的黑节点原创 2017-02-13 16:40:08 · 463 阅读 · 0 评论 -
二项堆(Binomial Heap)
1. 概念二项堆:它是一组由二项树组成的结构。1)二项树Bk是一棵具有以下性质的树(这是一个递归定义)[1]:A: 共有2^k 个节点B: 树的高度为kC:在深度i处恰有个节点,其中i = 0, 1, 2, ... kD: 根的度数为k,它大于任何其它节点的度数,并且如果根的子女从左到右编号为k - 1, k - 2, ..., 0, 子女i是子树Bi的根。具体形式如图原创 2017-02-20 11:16:20 · 9794 阅读 · 3 评论 -
二叉搜索树(Binary Search Tree)
概述二叉搜索树(Binary Search Tree)或者称为二叉排序树(Binary Sort Tree),它是一棵空树;或者是具有下列性质的二叉树:1.若它的左子树不空,则左子树树上的所有节点的值均小于它的根节点的值;2.或者是具有下列性质的二叉树:1.若它的右子树不空,则右子树上的所有节点的值均小于它的根节点的值;3.它的左,右子树也分别为二叉搜索书(二叉排序树)[1](注:是一个递归定原创 2017-01-18 17:13:04 · 323 阅读 · 0 评论 -
编程之美--第二章问题解答
8. 给定一个具有n个元素的实数集、一个实数t以及一个整数k,请问你如何快速地确定该实数集是否存在一具有k个元素的子集,其中各元素的总和至多只能为t。解: 利用寻找最小k元素,找到第k小的元素,然后将其前k个数相加的和与t比较即可。寻找最小k元素代码如下:int partition(int *arr, int from, int to) { int low = from; int原创 2017-10-23 22:54:16 · 259 阅读 · 0 评论