您的位置:首页 > 理论基础 > 数据结构算法

【数据结构-字符串】杂记

2017-04-22 18:50 183 查看
1.

对于一个字符串变量,例如”adereegfbw”,它的子串就是像”ader”这样可以从中找到的连续的字符串。字符串”adereegfbw”本身也属于它本身最长的子串。

子串数量的计算方法

ab的子串:a、b、ab和一个空子串共4个即(2+1+1)个,abc的子串:a、 b、 c、 ab、 bc 、abc和一个空子串 共(3+2+1+1)个,

所以若字符串的长度为n,则子串的个数就是[n*(n+1)/2]+1个,”software”中非空子串的个数就是8+7+….+1=36个。

2.哈夫曼编码

在建立不等长编码时必须使任何一个字符的编码都不是另一个字符的前缀,这宗编码称为前缀编码(prefix code)

(1)利用字符集中每个字符的使用频率作为权值构造一个哈夫曼树;

(2)从根结点开始,为到每个叶子结点路径上的左分支赋予0,右分支赋予1,并从根到叶子方向形成该叶子结点的编码

例题:

假设一个文本文件TFile中只包含7个字符{A,B,C,D,E,F,G},这7个字符在文本中出现的次数为{5,24,7,17,34,5,13}

利用哈夫曼树可以为文件TFile构造出符合前缀编码要求的不等长编码

具体做法:

将TFile中7个字符都作为叶子结点,每个字符出现次数作为该叶子结点的权值

规定哈夫曼树中所有左分支表示字符0,所有右分支表示字符1,将依次从根结点到每个叶子结点所经过的分支的二进制位的序列作为该

结点对应的字符编码

由于从根结点到任何一个叶子结点都不可能经过其他叶子,这种编码一定是前缀编码,哈夫曼树的带权路径长度正好是文件TFile编码

的总长度

通过哈夫曼树来构造的编码称为哈弗曼编码(huffman code)



3.快速画出哈夫曼树/霍夫曼树/最优树



4.

串就是字符串,是一种特殊的线性表,它的每个结点仅由一个字符组成。

串值也可用链表来存储,由于串的数据元素是一个字符,它只有8位二进制数, 因此用链表存储时,通常一个结点中存放的不是一个字符,而是一个子串,例如: 在编辑系统中,整个文本编辑区可以看成是一个串,每一行是一个子串,构成一个结点。

5.String与sizeof()

指针与静态数组的sizeof操作
指针均可看为变量类型的一种,所有指针变量的sizeof操作结果均为4 。(这个已实践证明)
所以不要用下面的方式去计算一个字符数组的长度:
char *a= “nihaomao”;
int count = sizeof(a);//返回值为4
而应该使用下面的方式计算:
char a[] = “nihaomao”;
int count = sizeof(a);返回值为1*8=8
int a[10];
sizeof(a)则返回值为4*10=40

6.

http://blog.csdn.net/antineutrino/article/details/6763722/

前缀表达式的运算符位于与其相关的操作数之前;中缀和后缀同理。

举例:

(3 + 4) × 5 - 6 就是中缀表达式

- × + 3 4 5 6 前缀表达式

3 4 + 5 × 6 - 后缀表达式

中缀表达式(中缀记法)

中缀表达式是一种通用的算术或逻辑公式表示方法,操作符以中缀形式处于操作数的中间。中缀表达式是人们常用的算术表示方法。

虽然人的大脑很容易理解与分析中缀表达式,但对计算机来说中缀表达式却是很复杂的,因此计算表达式的值时,通常需要先将中缀表达式转换为前缀或后缀表达式,然后再进行求值。对计算机来说,计算前缀或后缀表达式的值非常简单。

前缀表达式(前缀记法、波兰式)

前缀表达式的运算符位于操作数之前。

前缀表达式的计算机求值:

从右至左扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算(栈顶元素 op 次顶元素),并将结果入栈;重复上述过程直到表达式最左端,最后运算得出的值即为表达式的结果。

例如前缀表达式“- × + 3 4 5 6”:

(1) 从右至左扫描,将6、5、4、3压入堆栈;

(2) 遇到+运算符,因此弹出3和4(3为栈顶元素,4为次顶元素,注意与后缀表达式做比较),计算出3+4的值,得7,再将7入栈;

(3) 接下来是×运算符,因此弹出7和5,计算出7×5=35,将35入栈;

(4) 最后是-运算符,计算出35-6的值,即29,由此得出最终结果。

可以看出,用计算机计算前缀表达式的值是很容易的。

后缀表达式(后缀记法、逆波兰式)

后缀表达式与前缀表达式类似,只是运算符位于操作数之后。

后缀表达式的计算机求值:

与前缀表达式类似,只是顺序是从左至右:

从左至右扫描表达式,遇到数字时,将数字压入堆栈,遇到运算符时,弹出栈顶的两个数,用运算符对它们做相应的计算(次顶元素 op 栈顶元素),并将结果入栈;重复上述过程直到表达式最右端,最后运算得出的值即为表达式的结果。

例如后缀表达式“3 4 + 5 × 6 -”:

(1) 从左至右扫描,将3和4压入堆栈;

(2) 遇到+运算符,因此弹出4和3(4为栈顶元素,3为次顶元素,注意与前缀表达式做比较),计算出3+4的值,得7,再将7入栈;

(3) 将5入栈;

(4) 接下来是×运算符,因此弹出5和7,计算出7×5=35,将35入栈;

(5) 将6入栈;

(6) 最后是-运算符,计算出35-6的值,即29,由此得出最终结果。

7.[java]

“abc”+”def”则会创建三个字符串对象,第三个是”abcdef”。也就是说,在Java中对字符串的一切操作,都会产生一个新的字符串对象。

StringBuffer是线程安全的,它比String快。

8.字符串的两种最基本的存储方式是顺序存储方式和链接存储方式,字符串或串(String)是由零个或多个字符组成的有限序列,它是编程语言中表示文本的数据类型。通常以串的整体作为操作对象。串的两种最基本的存储方式是顺序存储方式和链接存储方式。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数据结构