首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >黄页搜索

黄页搜索
EN

Code Review用户
提问于 2015-06-02 20:38:27
回答 1查看 119关注 0票数 3

我已经根据一个竞赛问题用Free编写了代码(竞赛坚持我必须用Pascal编写)。它工作起来很有魅力,但我认为它仍然需要一些改进,从内存使用到运行时。

输入格式第一行是n (黄页中的人数)和q (搜索人数) {1 <= n <= 10000}{1 <= q <= 10000} Next n行都是黄页条目,每一行都是名称和电话号码,空格分隔。名字是大写字母,最大长度为15,而电话号码的长度正好是7位数字。接下来的q线是人们要搜索的,也是大写字母最大长度15。输出格式输出的是q线,其中每一行都是用户的电话号码,输入样本10亚伦8468431格雷戈里1765743杰克3746843吉尔1357891迈克尔1375638莫奈1357562希拉1378651泰瑞8756345殷1781945尹亚伦莫奈输出样本1765743 1781945 84684368431 1357562 3746843

我的代码

代码语言:javascript
复制
program YellowPages;

type string7 = String[7];

var
  namearray : Array of shortstring;
  numberarray, searcharray : Array of string7;
  input, name, search : shortstring;
  number : string7;
  n, q, iter1, iter2 : word;

procedure SplitInput(input : shortstring; var name : shortstring; var number : string7);
var 
  iter_proc, hitspace : byte;
begin
  hitspace := pos(' ', input);
  name := '';
  number := '';
  for iter_proc := 1 to length(input) do
  begin
    if iter_proc < hitspace then name := name + input[iter_proc];
    if iter_proc > hitspace then number := number + input[iter_proc];
  end;
end;

begin
  readln(n, q);
  setlength(namearray, n);
  setlength(numberarray, n);
  setlength(searcharray, q);
  for iter1 := 0 to (n - 1) do
  begin
    readln(input);
    SplitInput(input, name, number);
    namearray[iter1] := name;
    numberarray[iter1] := numberarray;
  end;
  for iter1 := 0 to (q - 1) do
  begin
    readln(search);
    for iter2 := 0 to (n - 1) do
    begin
      if namearray[iter2] = search then break;
    end;
    searcharray[iter1] := numberarray[iter2];
  end;
  for iter1 := 0 to (q - 1) do
  begin
    writeln(searcharray[iter1]);
  end;
end.
EN

回答 1

Code Review用户

发布于 2015-06-03 05:24:46

我要做的第一件事是从使用并行数组切换到使用单个记录数组。创建一个记录,记录电话簿中每个人的姓名和电话号码,如下所示:

代码语言:javascript
复制
Type
    Contact = Record 
        name : shortstring;
        number : String7;
        end;

一旦您这样做了,您应该根据每个联系人的名称对数组进行排序。快速排序算法很容易实现,而且在大多数情况下通常是相当快的。

一旦对数组进行了排序,而不是从一开始就搜索整个电话簿,您可以使用二进制搜索查找所需的每条记录,并从中获取电话号码。二进制搜索不应该比log2(n)更需要比较(其中n是要搜索的数组的大小)。而你的搜索平均需要n/2的比较。因此,对于100个条目,用二进制搜索进行的比较不会超过8次,而通常使用线性搜索进行50次左右的比较。

我已经很久没有使用FreePascal或任何其他Pascal编译器了。有可能他们有一些内置的排序和搜索过程,您可以使用。但是,实现上面提到的那些并不难。

另外,在SplitInput()中,您要手动地将数据从一个字符串复制到另一个字符串。通常有一个库,它有一个用于复制字符串或字符串的一部分的过程。这些通常比写你自己的要快。(例如,在C语言中,您可以使用memcpy()strncpy()。我不确定Pascal中是否有类似的。)

票数 1
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/92500

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档