2013年10月30日

算法打基础——HashⅡ: 全域哈希与完美哈希

摘要: 这一节涉及数学超级多,各种数论知识,各种不明觉厉! 看了几遍,才勉强看懂一些,所以这篇稍微简单的介绍着两种hash table, 免得瞎说说错了。这一讲的主要知识点是:1. 全域哈希及构造 2. 完美哈希1. 全域哈希及构造介绍全域哈希之前,要先讨论一下普通哈希的一个缺点。 举个charles举得那个例子:如果你和一个竞争对手同时为一家公司做compiler的symbol table, 公司要求你们代码共享(o(╯□╰)o),你们做好后公司评判的标准就是 你俩互相提供一些测试样例,谁的效率高就买谁的。然后,普通哈希的缺点就出来了:对任意的hash函数h,总存在一组keys,使得, 对某个槽i. 阅读全文

posted @ 2013-10-30 15:23 soyscut 阅读(10238) 评论(4) 推荐(0) 编辑

2013年10月28日

算法打基础——HashTable

摘要: 这一节主要讲很多方面非常重要的hash table等问题. 由于平时很少用到这些,基本都忘了。。。怎样快速的在内存中插入、删除、和搜索呢? 这就需要哈希表了这一节主要知识点是:1 简单的映射表和处理冲突方法 2.哈希函数的选择 3.开放寻址法(高级解决冲突方案)1 简单的映射表和处理冲突方法哈希表希望解决的一个典型问题是编译器内部的符号表,它的结构是:每个记录有一个指针x指向这个记录,key[x]就是这个记录的关键字,然后后面就是一些具体数据。如果我们想方便得进行增删查操作,这些数据应该如何组织呢?最简单的方法:直接寻址表这个方法当键值得范围相对较小的时候还是能够很好工作的。假设key... 阅读全文

posted @ 2013-10-28 13:22 soyscut 阅读(1937) 评论(4) 推荐(3) 编辑

2013年10月26日

算法打基础——顺序统计(找第k小数)

摘要: 这次主要是讲如何在线性时间下找n个元素的未排序序列中第k小的数。当然如果\(k=1 or k=n\),即找最大最小数,线性时间内遍历即可完成,当拓展到一般,如中位数时,相关算法就值得研究了。这里还要说明的是,排序解决是一种平凡算法,但其复杂度是\(\Theta(nlogn)\)这次内容的主要知识点有:1.随机化版本的分治法求解&分析2.基于1的优化pivot选择的算法&分析 1.随机化版本的分治法求解与分析首先,要明确的是现在我们要解决的问题是求解n元素序列的第k小数这种方法的主要思想是:从序列中随机选一个数pivot,然后用类似于merge-sort的分割方法,将序列分成大于 阅读全文

posted @ 2013-10-26 17:02 soyscut 阅读(3246) 评论(0) 推荐(1) 编辑

2013年10月22日

算法打基础——线性时间排序

摘要: 这一节主要讲线形时间排序的算法,主要的知识点是:1. 基于比较的排序的下界及分析 (两种线性排序算法)2.计数排序 3.radix排序1. 基于比较的排序的下界及分析前面介绍了很多用于排序的算法(merge sort,quicksort,insertion sort等),目前这些算法最小的时间复杂度就是Θ(nlogn).事实上,这些基于比较的排序算法最差情况下最好的时间复杂度就是O(nlogn).这点是可以通过决策树来帮助我们分析证明的。决策树这个东西,学过人工智能之类的应该就很熟悉了,就是根据元素比较的不同情况往不同分支走,然后树将所有可能的情况都包括进去。举一个三个元素的例子:=注意这.. 阅读全文

posted @ 2013-10-22 16:07 soyscut 阅读(2001) 评论(0) 推荐(0) 编辑

2013年10月20日

算法打基础——快排

摘要: 快排是各种排序中算法,非常重要的一种。其用到的主要思想也是分治法。这一节主要涉及到的知识点有:1 基本快排 2.快排的直观及数学分析 3 随机化的快排及其严格的数学分析(数学分析在算法笔记中)1 快排的基本内容快排啊,其基本思想也是分治法。它是一种原地排序的算法,即和插入排序一样,不需要额外的空间去存储。比如归并排序就不行了,就需要额外空间去移动着来排序快排的divide-and-conquer步骤:1 分裂: 将数组用一个pivot x 分成两个部分,左半部分≤x,右半部分≥x2.conquer: 递归的去处理分裂的子数组3.合并:原地算法,直接就是合并好的所以,快排的分割子算法就非常重要了 阅读全文

posted @ 2013-10-20 15:25 soyscut 阅读(1905) 评论(0) 推荐(0) 编辑

2013年10月18日

算法打基础——分治法

摘要: 第三讲主要是讲divide-and-conquer, 与上一讲结合的很紧密,因为分治法几乎都是递归啦,求复杂度必备啊!这一讲的主要知识点有:1.分治法主要步骤 (后面就全是分治法的应用了)2.二分搜索 3.快速求幂 4.快速求斐波那契数列 5.矩阵连乘(Strassen's algorithm) 下面分别来介绍分治法的主要步骤: 分为三步。1. 将问题分解成子问题2.递归的去解决这些子问题3. 合并这些子问题举前面的归并排序来说,这是非常典型的分治法。1.Divide:Trivial.2.Conquer:Recursively sort 2subarrays.3.Combine:Lin 阅读全文

posted @ 2013-10-18 22:47 soyscut 阅读(684) 评论(0) 推荐(0) 编辑

算法打基础——符号&递归解法

摘要: 第二节 算法复杂度分析的的基本符号及 递归关系式下的复杂度解法这次的主要知识点是:1.各种复杂度符号 2.递归复杂度解法: 分为三种 替换法(猜!) 递归树法 主定理1各种复杂度符号big O definition:O(g(n))= { f(n) : there existconstants c>0, n0>0 such that 0=n0}bigΩ definition:Ω(g(n))= { f(n): there exist constants c>0, n0>0 such that 0=n0}bigΘ definition:Θ(g(n)) = O(g(n)) ∩Ω 阅读全文

posted @ 2013-10-18 15:50 soyscut 阅读(628) 评论(0) 推荐(0) 编辑

2013年10月15日

算法打基础——算法基本分析

摘要: 因为基础实在太差,决定从看算法导论视频+书开始重新打打基础,希望能坚持下来!!第一节 算法基本分析个人认为 本节的主要知识点有:1 插入排序及其分析 2 算法复杂度基本符号 3 merge sort及其分析1 插入排序及其分析插入排序伪代码:INSERTION-SORT (A, n) ⊳A[1 . . n] for j ←2 to n do key ←A[ j] i ←j –1 while i > 0 and A[i] > key doA[i+1] ←A[i] i ←i –1 A[i+1] = key排序算法... 阅读全文

posted @ 2013-10-15 16:57 soyscut 阅读(348) 评论(0) 推荐(0) 编辑

最小生成树——Kruskal算法

摘要: 先上最小生成树定义:在一个给定的无向图G=(V,E)中, (u,v)代表连接顶点u和v的边,而w(u,v)代表这个边的权重。若存在T为E的子集,且为无循环图,使得中的w(T)最小,则这个T为G的最小生成树(MST)最小生成树的几个性质:最小生成树的边数必然是顶点数减一,|E| = |V| - 1。最小生成树不可以有循环。最小生成树不必是唯一的。求解一个图的最小生成树有很多算法,这里介绍Kruskal算法。算法的执行过程可以描述为:1.将图中所有的边按照从小到大的顺序排序2.从小到大依次考察每条边(u,v)是否要当前的生成树集中。考查结果分为两种情况: case 1: u和v在同一连通分量中,那 阅读全文

posted @ 2013-10-15 15:49 soyscut 阅读(1122) 评论(0) 推荐(2) 编辑

最小生成树——Prim算法

摘要: prim算法是生成最小生成树的一个重要方法,它非常类似于最短路径的Dijastra算法. Prim算法的特点是树的集合中的边总是形成单颗树。Prim算法的主要过程是:从图中某一顶点u出发,作为树集合U的根节点,然后在集合W=V-U和集合U中寻找两个顶点u∈U,w∈V-U, 使得这两个顶点的边(u,w)是这两个集合顶点连接的边中权值最小的, 然后将顶点w加入到集合U中,同时记录加入的这个边。重复这个过程只到集合W中所有的顶点w都加入到了U中,或者说W成为空集。Prim算法的主要步骤如下图演示:Prim的算法代码如下(这个代码中,寻找最小权值是用的遍历,并没有优化,算法导论里面用的是优先队列):# 阅读全文

posted @ 2013-10-15 15:46 soyscut 阅读(521) 评论(0) 推荐(0) 编辑

导航