码迷,mamicode.com
首页 > 编程语言 > 详细

第十至十二章 算法分析--高阶数据结构

时间:2017-11-17 00:01:44      阅读:269      评论:0      收藏:0      [点我收藏+]

标签:put   turn   红黑树   span   ring   ges   efi   预处理   红色   

1.贪婪算法的第二个应用为 哈夫曼编码 来进行文件压缩。 文件压缩的主要问题是给文件中的所有字符分配能唯一识别的编码(n个比特),如果我们事先知道所有字符出现的频率,把频率最高的放在最上层,频率低的放在左侧最下层,这就是最优编码。

2.编码树,所有字符都放在叶节点上,往左走的每条路径代表0,往右走的每条路径代表1,这种数据结构有时候叫做trie树,节点的深度既是需要的比特位数。这种树是满树:所有的节点要么是树叶,要么有两个儿子。一种最优的编码将总是具有这个性质。并且这样的编码既是前缀码。

3.红黑树

(1)红黑树是AVL树(自平衡二叉搜索树)的变种,其各种操作在最坏情形下花费O(logN)时间;

(2)红黑树性质:1.根是黑色的 2. 红色节点的子节点必须是黑色的 3.一个节点到一个null 引用的每条路径必须包含相同数目的黑色节点。

(3)自底向上的插入:1.新插入的项的父节点是黑色的,则插入完成

          2.如果插入节点的父节点是红色的:

          2.1父节点的兄弟节点是黑色的,可以通过单旋转或者双旋转。

          2.2父节点的兄弟也是红色的,需要通过上虑操作解决。

(4)自顶向下红黑树:可以提前对红黑树进行自顶向下的过程,从而保证父节点的兄弟不为红色。

 4.后缀数组与后缀树

(1)数据处理中最基础的问题之一是从文本T中找到一段模式P所在的位置,并回答下列问题:a.存在能匹配P的T的子串吗  b.P在T中出现了多少次,及位置。c.一般的问题,T是固定,针对不同的P有频繁的请求。为了达到这些目的,我们一般会将T预处理成一种特殊的数据结构即后缀数组或后缀树。

(2)后缀数组:文本T的后缀数组实际上就是T的所有后缀进行有序排列所组成的一个数组。  模式P如果在文本中,则P一定是某个后缀的前缀,那么可以通过折半查找,以O(logT)

的时间找到。同时计算相邻后缀的最大公共前缀的话,则每次找P出现的次数为O(P+ logT)

(3)后缀数组的Java实现

 //compute the longest share string prefix
public static int computaLCP(String s1,String s2){
int i=0;
while(i<s1.length()&&i<s2.length()&&s1.charAt(i)==s2.charAt(i)){
i++;
}
return i;
}

public static void createSuffixArray(String str,int[] SA,int[] LCP){
if(SA.length!=str.length()||LCP.length!=str.length())
throw new IllegalArgumentException();

int N = str.length();

String[] suffiesx = new String[N];
for (int i = 0; i < N; i++) {
suffiesx[i] = str.substring(i);
}
Arrays.sort(suffiesx);

for (int i = 0; i < N; i++) {
SA[i] = N-suffiesx[i].length();
}

LCP[0] = 0;
for (int i = 1; i < N; i++) {
LCP[i] = computaLCP(suffiesx[i],suffiesx[i-1]);
}

}

第十至十二章 算法分析--高阶数据结构

标签:put   turn   红黑树   span   ring   ges   efi   预处理   红色   

原文地址:http://www.cnblogs.com/jetHu/p/7846542.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!