在Robert Sedwick的书中使用符号表进行字符串搜索

时间:2014-01-07 14:03:54

标签: c++ algorithm binary-search-tree

我正在阅读Robert Sedwick的C ++算法。在第12章中,将介绍文本后面的符号表。

该程序假定Item.cxx定义了项中字符串键的char *数据表示,一个重载的运算符<使用strcmp,使用strncmp的重载operator ==,以及从Item到char *的转换运算符(参见文本)。主程序从指定文件中读取文本字符串,并使用符号表从通过从文本字符串中的每个字符开始定义的字符串构建索引。然后,它从标准输入读取查询字符串,并打印在文本中找到查询的位置(或未找到打印)。使用BST符号表实现,搜索速度很快,即使对于大字符串也是如此。

#include <iostream.h>
#include <fstream.h>
#include "Item.cxx"
#include "ST.cxx"
static char text[maxN];
int main(int argc, char *argv[])
  { int N = 0; char t;
    ifstream corpus; corpus.open(*++argv);
    while (N < maxN && corpus.get(t)) text[N++] = t;
    text[N] = 0;
    ST<Item, Key> st(maxN);
    for (int i = 0; i < N; i++) st.insert(&text[i]);
    char query[maxQ]; Item x, v(query);
    while (cin.getline(query, maxQ))
      if ((x = st.search(v.key())).null())
           cout << "not found: " << query << endl;
      else cout << x-text << ": " << query << endl; // Question here.
  }
  

以上程序从标准输入读取一系列查询,使用   搜索以确定每个查询是否在文本中,并打印出来   第一次出现查询的文本位置。如果符号   表是用BST实现的,那么我们期望搜索会   涉及大约2N n N个比较。例如,一旦索引是   建成后,我们可以在包含大约1的文本中找到任何短语   百万字符(如Moby Dick)约有30个字符串   比较。此应用程序与索引相同,因为C   字符串指针是字符数组的索引:如果x指向   text [i],那么两个指针x-text之间的区别就是   等于我。

我对上述文字的质询是

  1. 上面的程序如何在符号表中找到字符串,因为作者只存储了char?程序中是否有错误。

  2. 如下面的评论所述,“如果x指向text [i],那么两个指针x-text之间的差异等于i。”作者如何得出结论?

  3. 文字“我们可以在包含约100万个字符的文本中找到任何短语(例如Moby Dick),并进行大约30个字符串比较。”在这里,作者相信我们可以在给定文本中找到30个字符串比较的短语。因为我们需要2NlogN比较吗?

  4. 4.如果任何人有权访问作者如何绘制BST图12.11。索引文本字符串的示例“?以及如何将其链接到上述程序。

    谢谢!

1 个答案:

答案 0 :(得分:0)

我没有该文字,但我通过谷歌图书访问了大部分相关部分。

  1. text确实是一个字符数组。但是,当构建搜索树st时,插入的是字符指针(st.insert(&text[i]))。您可以将char*视为C字符串的类型。因此搜索树对字符串而不是字符进行操作。

  2. x指向text[i],暗示x - text == i是C指针算术。

    char text[1];
    int i = 0;
    char* x = &text[i];
    int ii = x - text;
    assert(i == ii);
    
  3. “2N ln N”是一个错字。如果你回头看“财产12.6”,你会看到它应该是“2 ln N”,对于N等于一百万,它是27.63,或者大约30。

  4. 我无法通过谷歌图书访问图12.11,所以我无法回答这个问题。