2009-06-17 70 views
1

好吧,我正在制作一个基于命令行的网站搜索功能。该网站按字母顺序列出了我需要的所有链接。关于python排序效率的问题

用法会是这样的

./find.py LinkThatStartsWithB 

因此,这将导航与字母B.相关的网页 我的问题是什么是用户使用的输入和浏览最有效的/最聪明的方式到网页?

我最初的想法是沿着使用列表的方式,然后获取单词的第一个字母,并使用数字标识符来告诉列表索引的位置。

(A = 1,B = 2 ...) 示例代码:

#Use base url as starting point then add extension on end. 
Base_URL = "http://www.website.com/" 

#Use list index as representation of letter 
Alphabetic_Urls = [ 
     "/extensionA.html", 
     "/extensionB.html", 
     "/extensionC.html", 
     ] 

或者将字典是一个更好的选择?

谢谢

回答

3

你是如何得到这个URLS列表的?

如果您的命令行应用程序正在抓取网站的链接,并且您只查找单个项目,则构建字典毫无意义。建立字典至少需要很长时间,因为它只是在你去的时候检查!例如,只需搜索为:

for link in mysite.getallLinks(): 
    if link[0] == firstletter: 
     print link 

如果你打算做多次搜索(而不仅仅是一个单一的命令行参数),然后它可能是值得使用类似建立一个字典:

import collections 
d=collections.defaultdict(list) 
for link in mysite.getallLinks(): 
    d[link[0]].append(link)    # Dict of first letter -> list of links 

# Print all links starting with firstletter 
for link in d[firstletter]: 
    print link 

虽然只有26个水桶,但它不会有太大的区别。

1

这里最聪明的方法是使代码最简单的阅读方式。如果列表中只有26个项目,谁在乎使用什么算法来查看它?你必须真的使用一些东西,真的是愚蠢的,使它对性能有影响。

如果你真的对性能感兴趣,你需要基准不同的选项。只看复杂性并不能说明整个故事,因为它隐藏了所涉及的因素。例如,字典查找将涉及计算密钥的散列值,在表中查找,然后检查相等性。对于简短列表,简单的线性搜索有时可能更高效,具体取决于哈希算法的代价。

如果你的例子真的很精确,你不能只是输入字符串的第一个字母,并预测它的URL? ("/extension" + letter + ".html"

+0

嗯,这是为什么我指定了高效/最聪明。我也在质疑,如果使用一个而不是另一个更好的做法。我一直在努力提高我的编程技巧。 – sdsd 2009-06-17 07:08:58

+0

但我的观点是,高效和最聪明的在这里不是一回事。什么代码将是最简单的? – 2009-06-17 08:25:01

0

如果您有(并且将始终有)少量项目,词典将是一个不错的选择。如果将来URL的列表将会扩展,您可能实际上想要按照它们的字母对URL进行排序,然后将输入与该输入进行匹配,而不是对每个字典进行硬编码。

0

因为听起来你只谈论26个项目,所以你可能不必过于担心效率问题。你想出的任何东西都应该足够快。

通常,我建议尝试使用数据结构,它是问题域的最佳近似值。例如,这听起来像是在试图将字母映射到URL。例如,这是“A”网址,这是“B”网址。在这种情况下,像一个字典映射数据结构听起来合适:

html_files = { 
    'a': '/extensionA.html', 
    'b': '/extensionB.html', 
    'c': '/extensionC.html', 
} 

虽然在这个确切的例子中,你实际上可以作弊,并完全跳过的数据结构 - '/extension%s.html' % letter.upper() :)