我已经根据一个竞赛问题用Free编写了代码(竞赛坚持我必须用Pascal编写)。它工作起来很有魅力,但我认为它仍然需要一些改进,从内存使用到运行时。
输入格式第一行是
n(黄页中的人数)和q(搜索人数){1 <= n <= 10000}和{1 <= q <= 10000}Nextn行都是黄页条目,每一行都是名称和电话号码,空格分隔。名字是大写字母,最大长度为15,而电话号码的长度正好是7位数字。接下来的q线是人们要搜索的,也是大写字母最大长度15。输出格式输出的是q线,其中每一行都是用户的电话号码,输入样本10亚伦8468431格雷戈里1765743杰克3746843吉尔1357891迈克尔1375638莫奈1357562希拉1378651泰瑞8756345殷1781945尹亚伦莫奈输出样本1765743 1781945 84684368431 1357562 3746843
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.发布于 2015-06-03 05:24:46
我要做的第一件事是从使用并行数组切换到使用单个记录数组。创建一个记录,记录电话簿中每个人的姓名和电话号码,如下所示:
Type
Contact = Record
name : shortstring;
number : String7;
end;一旦您这样做了,您应该根据每个联系人的名称对数组进行排序。快速排序算法很容易实现,而且在大多数情况下通常是相当快的。
一旦对数组进行了排序,而不是从一开始就搜索整个电话簿,您可以使用二进制搜索查找所需的每条记录,并从中获取电话号码。二进制搜索不应该比log2(n)更需要比较(其中n是要搜索的数组的大小)。而你的搜索平均需要n/2的比较。因此,对于100个条目,用二进制搜索进行的比较不会超过8次,而通常使用线性搜索进行50次左右的比较。
我已经很久没有使用FreePascal或任何其他Pascal编译器了。有可能他们有一些内置的排序和搜索过程,您可以使用。但是,实现上面提到的那些并不难。
另外,在SplitInput()中,您要手动地将数据从一个字符串复制到另一个字符串。通常有一个库,它有一个用于复制字符串或字符串的一部分的过程。这些通常比写你自己的要快。(例如,在C语言中,您可以使用memcpy()或strncpy()。我不确定Pascal中是否有类似的。)
https://codereview.stackexchange.com/questions/92500
复制相似问题