顺序搜索

来自于一个太大范围的关键字是不能作为索引的。符号表实现的一个简单方法是把数据项按照顺序连续地存放在数组中。当要插入一个新的数据项时,就像插入排序中所做的那样,将较大的元素移动一个位置,把新的数据项放进数组中;当要进行搜索时,我们顺序地查找数组。因为数组是有序的,当遇到一个大于搜索关键字的关键字时,我们即可报告搜索失败。

基于数组的实现:

static Item *st;

static int N;

void STinit( int maxN )

{

       st= malloc((maxN)*sizeof(Item));

       N= 0;

}

 

int STcount()

{

       returnN;

}

 

void STinsert(Item item)

{

       intj = N++;

       Keyv = key(item);

       while(j>0&&less(v,key(st[j-1])))

       {

              s[j]= s[j-1];

              j--;

}

st[j] = item;

}

 

Item STsearch(Key v)

{

       intj;

       for(j=0;j<N;j++)

{

       if(eq(v,key(st[j])))

              return st[j];

       if(less(v,key[st[j]]))

              break;

}

return NULLitem;

}

Item STselect(int k)

{

       returnst[k];

}

void STsort(void (*visit)(Item))

{

       inti;

       for(i=0; i<N;i++)

              visit(st[i]);

}

对于搜索的实现中可以进行改进:对于表中不存在搜索关键字的数据项的情况,使用一个观察哨来避免尾部的测试。

 

如果不要求数据项在数组中有序,可以有另一种实现方法。当插入一个新数据项时,我们把它放在数组的末尾。当进行搜索时,只要顺序查看数组即可。这种方法的特性是插入快,但选择和排序需要大量的工作。

 

使用链表是另一种直接实现符号表的方法。我们可以选择使链表有序,能够很容易地支持

“排序”操作,或者选择使链表无序,这样“插入”操作很快。使用链表较之数组的优点是,

我们不需预测出表的大小,缺点是需要额外的空间。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值