[关闭]
@quinn 2015-04-13T13:30:29.000000Z 字数 1872 阅读 1816

搜索(1):符号表

搜索算法



1. 符号表的概念

搜索:我们把处理的数据划分为记录或数据项(item),每个数据项都有一个用于搜索的关键字(key)。搜索的目标是找出目标关键字所匹配的数据项。搜索的目的是访问这个数据项(不仅是关键字)中的信息。
符号表:它是一种数据结构,其中数据项含有关键字。它支持两个基本的操作:插入一个新的数据项和搜索返回给定关键字的数据项。(字典)

如何处理符号表中相同关键字?
在符号表的实现中应注意考虑可能楚翔相同关键字的数据项。在某些应用(如身份证信息)中不允许出现重复关键字,此时,关键字可以作为句柄。其他包含大量相同关键字的应用(如文档数据库),关键字搜索会有多个查询结果。有以下三种处理方法:
(1)在主数据结构中的关键字保持都不同,即将具有相同关键字的数据项组合到一起,形成一个链接。search 时返回所有给定关键字对应的所有数据项;delete 时删除所有给定关键字对应所有数据项。
(2)在主数据结构中关键字可以相同,search 时返回任意一个给定关键字的数据项,delete 时删除任意一个。
(3)给每一个数据项添加另外的标识符(唯一),搜索和删除时给出关键字和标识符

2. 符号表的顺序搜索

根据应用的期望时间和空间要求,有四种符号表的实现方法:
(1)有序数组:频繁使用排序或选择 select
(2)有序链表:频繁使用排序,频繁选择时应选用有序数组,链表只能顺序访问
(3)无序数组:频繁插入
(4)无序链表:频繁插入
其中,链表较之数组的优点是,不需预测出表的大小,缺点是额外占用空间(存放链接),且不能高效支持选择操作。

2.1 基于有序数组的符号表

插入时,犹如插入排序时,将较大元素向后移动位置,将新的元素插入数组中

  1. static Item *st;
  2. static int N;
  3. void STinit(int maxN)
  4. { st = malloc((maxN)*sizeof(Item)); N = 0; }
  5. int STcount()
  6. { return N; }
  7. void STinsert(Item item)
  8. { int j = N++; Key v = key(item);
  9. while (j>0 && less(v, key(st[j-1])))
  10. { st[j] = st[j-1]; j--; }
  11. st[j] = item;
  12. }
  13. Item STsearch(Key v)
  14. { int j;
  15. for (j = 0; j < N; j++)
  16. {
  17. if (eq(v, key(st[j])))
  18. return st[j];
  19. if (less(v, key(st[j])))
  20. break;
  21. }
  22. return NULLitem;
  23. }
  24. Item STselect(int k)
  25. { return st[k]; }
  26. void STsort(void (*visit)(Item))
  27. { int i;
  28. for (i = 0; i < N; i++) visit(st[i]);
  29. }

2.2 基于无序链表的符号表

  1. //不完整代码,仅供简略查看原理
  2. #include <stdio.h>
  3. #define Key(A) (A - 'a')
  4. #define NULLItem -1
  5. typedef struct Element Item;
  6. typedef struct Element
  7. {
  8. int key;
  9. char data;
  10. };
  11. typedef struct STnode* link;
  12. typedef struct STnode
  13. {
  14. Item item;
  15. link next;
  16. } STnode;
  17. static int N; //表元素的个数
  18. static link head, z;
  19. link New(Item item, link next)
  20. {
  21. link x = (link)malloc(sizeof(*x));
  22. x->item = item;
  23. x->next = next;
  24. return x;
  25. }
  26. link STInit()
  27. {
  28. link x = (z = new(NULLItem, NULL));//z为哑节点
  29. N = 0;
  30. return x;
  31. }
  32. //=============Search===============
  33. Item searchR(link t, Key v)
  34. {
  35. if (t == z)
  36. return NULLitem;
  37. if (eq(key(t->item), v))
  38. return t->item;
  39. return searchR(t->next, v);
  40. }
  41. Item STsearch(Key v)
  42. { return searchR(head, v); }
  43. link STInsert(Item item)
  44. {
  45. head = New(item, head);
  46. N++;
  47. }

3. 参考资料

《算法:C语言实现》P307 - P316

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注