①树的带权路径长度
树的带权路径长度(Weighted Path Length of Tree):定义为树中所有叶结点的带权路径长度之和。
结点的带权路径长度:结点到树根之间的路径长度与该结点上权的乘积。
②插入排序的理解
始终定义第一个元素为有序的,将元素逐个插入到有序排列之中,其特点是要不断的移动数据,空出一个适当的位置,把待插入的元素放到里面去,每次都选择当前元素,插入到前面已经排好序的序列中。
③选择排序的理解
每次在无序队列中“选择”出最小值,放到有序队列的最后,并从无序队列中去除该值。即每次在后面未排序好的序列中选择一个最小(或最大)的元素放到本来无序的序列的第一个元素中。
④数组定义问题
int a[][4],这种定义是错的,二维数组需要初始化,即int a[][4]={1,2,3,4}。
⑤关系运算符优先级问题
⑥深度优先搜索例子探索
图的深度遍历思想是,在当前节点,挑选一条没有走过的路,抵达路尽头的节点,如果在路尽头的节点附近的节点都走过,则退回,
直到可以选择没有走过路的节点,具体解析:
第一个:aebdfc:a-
e
-
b
-
e
-
d
-
f
-c;
第二个:aedfcb:a-
e
-
d
-
f
-
c
-
f
-
d
-
e
-b;
第三个:acfdeb:a-
c
-
f
-
d
-
e
-b;
第四个:aefdcb:a-
e
-
f
-
d
-
c
-b;
第五个:aefdcb:a-
e
-
f
-
d
-
f
-
c(c此处没有走的是c节点)
-
e
-b(错误)
⑦指针的进一步理解
实例分析:
#include<stdio.h>
int
main()
{ static
char
*s[] = {
"black"
,
"white"
,
"pink"
,
"violet"};
char
**ptr[] = {s+
3
, s+
2
, s+
1, s}, ***p;
p = ptr;
++p;
printf(
"%s"
, **p+
1);
return
0;
}
首先s是一个指针数组,存的是字符串的首地址,char **ptr[] 是一个指针数组,不过是一个二级指针数组,存的是s这个数组中,每个元素的地址,p是一个三级指针,ptr这个二级指针数组的数组名也是一个三级指针,p++只是往后跳了一个元素的位置,*p就是第二个元素的内容,也就是指向s数组中s+3这个元素的地址, **p就得到了s数组中s+3这个元素的内容, s数组中保存的是字符串的首地址,那就得到了
"pink"
这个元素的首地址,在**p+1就是这个地址向后偏移一个字节,也就指到了'i'上,所以 %s, **p+1还是"ink"。
⑧哈希函数相关
哈希函数构造方法:
1.直接定址法:H(key) = a*key + b
2.除留余数法:H(key) = key % p(p为不大于散列表表长,但最接近或等于表长的质数p
3.数字分析法:选取r进制数数码分布较为均匀的若干位作为散列地址
4.平方取中法:取关键字的平方值的中间几位作为散列地址
5.折叠法:将关键字分割成位数相同的几部分,然后取这几部份的叠加和作为散列地址
处理冲突的方法:
1.开放定址法(闭哈希表)
Hi = (H(key)+di) % m(m表示散列表表长,di为增量序列)
1)线性探测法
2)平方探测法
3)再散列法
4)伪随机数法
注:在开放定址的情形下,不能随便物理删除表中已有元素,若删除元素将会截断其他具有相同散列地址的元素的查找地址。若想删除一个元素,给它做一个删除标记,进行逻辑删除。
2.拉链法(开哈希表)
把所有的同义词存储在一个线性链表中,线性链表由其散列地址唯一标识,拉链法适用于经常进行插入和删除的情况。