开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第10天,点击查看活动详情
3.1 树与树的表示
什么是树
-
人类社会家谱,社会组织结构,图书信息管理都是树的一种体现(层次型的组织结构)
-
分层次组织在管理上具有更高的效率
- 数据管理的基本操作之一:查找
3.1.1 引子(顺序查找)
查找(Searching)
查找:根据某个给定关键字K,从集合R中找出关键字与K相同的记录
静态查找:集合中记录是固定的
没有插入和删除操作,只有查找(例如查字典)
动态查找:集合中记录是动态变化的
除查找,还可能发生插入和删除
静态查找
方法1:顺序查找
int SequentialSearch (List Tbl,ElementType K)
{
// 在Element[1]~Element[n]中查找关键字为K的数据元素
int i;
Tbl->ElementP[0] = K;//建立哨兵
for(i = Tbl->Length;Tbl->Element[i] != K;i--);//倒过来做的,从下标大的地方开始往前循环
return i;//查找成功返回所在单元下标;不成功不返回0
}
typedef struct LNode{
ElementType Element[MAXSIZE];//决定了放的元素有多少个
int Length;
};
顺序查找的一种实现(无"哨兵")
int SequentialSearch (List Tbl ,ElementType K)
{
//在Element[1]~Element[n]中查找关键字为K的数据元素
int i;
for(i=Tbl->Length; i>0 && Tbl->Element[i] != K;i--);
return i;//查找成功返回所在单元下标,不成功返回0
}
在顺序查找中,如果把下列程序中的循环条件"i>0"去掉,会发生什么后果?
答案:要查找的元素不存在时发生数组越界(i指向小于0的位置)
"哨兵"的作用:可以在数组的最后或者边界上面设一个值,不用每次去判断它的下标是不是达到我的边界。根据for循环,当碰到我们放置的那个值的时候,循环就该退出来了。这样我们在写判断的时候就可以少写一个判断的分支
我的理解是这个哨兵通常放置在下标0的地方,然后循环从大往小循环,循环到1如果都没有我们需要的值的时候,放在下标0的地方的哨兵是等于我们需要的值来退出循环,代替了for条件中的不能小于0,防止for循环陷入死循环或者说越界跑到下标负数的地方去了。然后返回值如果是0的话我们就心知肚明没有找到我们想要的值了
这种顺序查找算法的时间复杂度为O(n),平均数是n/2