2009-06-17 71 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() :)