2015-04-05 92 views
1

這個問題沒有特別針對任何編程語言,當然我很高興聽到一些例子。什麼是結合switch/if語句的最有效方式

想象一下大量的文件,比如說5000,其中包含各種字母和數字。然後,有一種方法可以接收用作別名的用戶輸入以顯示該文件。如果不在文件夾中排序文件,則方法需要返回與用戶提供的別名關聯的文件名。

所以我們可以說用戶輸入 「gd322」 代表名爲 「k4e23」 的文件,該方法看起來像

if(input.equals("gd322")){ 
      return "k4e23"; 
          } 

現在,想象一下這種方法有4個值:

switch(input){ 
case gd322: return fw332; 
case g344d: return 5g4gh; 
case s3red: return 536fg; 
case h563d: return h425d; 
    } //switch on string, no break, no string indicators, ..., pls ignore the syntax, it's just pseudo 

記住我們有5000個條目,可能不止有2個條目以g開頭。現在,如果用戶輸入以's'開始,而不是浪費CPU週期檢查所有a,b,c,...,我們也可以爲此創建另一個開關,然後指向這樣的'next'方法:

switch(input[0]){ //implying we could access strings like that 
    case a: switchA(input); 
    case b: switchB(input); 
// [...] 
    case g: switchG(input); 
    case s: switchS(input); 
     } 

所以CPU不必檢查所有的人,而是要求一個像這樣的方法:

switchG(String input){ 

switch(input){ 
    case gd322: return fw332; 
    case g344d: return 5g4gh; 
    // [...] 

    } 

有計算機科學處理這個問題的任何領域?我不知道該怎麼稱呼它,因此不知道如何搜索它,但我認爲我的想法是大規模的。請移動線程,如果它不屬於這裏,但我真的想看到你的想法。

編輯:不要引用我對那個「5000」,我不在上面描述的情況,我想談論這個完全理論,它也可能是3條或300'000,甚至更少或更多

+0

您正在尋找某種查找結構(hashmap,排序列表,搜索樹,無論),而不是'switch'語句。 – Bergi 2015-04-05 20:50:56

回答

1

如果你有5000個選項,你可能比使用硬編碼的if/switch語句散列它們更好。在C++中,也可以使用std :: map將函數指針或其他選項處理信息與每個可能的選項配對。

1

有趣,但我不認爲你可以給出一個通用的答案。這完全取決於代碼的執行方式。許多編譯器將進行各種優化,在ifswitch中,但也以字符串進行比較的方式進行優化。這就是說,如果你有這些列表的實際(磁盤)文件,那麼讀取文件可能需要比處理它長得多的時間,因爲與存儲器訪問和CPU處理相比,磁盤I/O非常慢。

如果你有這樣的列表,你可能想要構建一個哈希表,或者只是一個可以執行二分搜索的排序列表/數組。對它進行排序也需要時間,但是如果你必須在同一個列表中進行多次查找,那麼這可能是值得的。

1

有沒有計算機科學處理這方面的任何領域?

是的,高效科學data structures。那麼,CS不是那麼重要? :-)

您描述的算法類似於trie。它不會在源代碼中用switch語句進行靜態編碼,但會在從某處和某處加載的結構中使用動態查找,但這個想法是相同的。

1

是的,這個問題自數十年來就已知並解決。 散列函數。

基本上你有一組值(這裏的字符串像「gd322」,「g344d」),並且你想知道其他值是否在其中。

這個想法是把字符串放在一個大數組中,在一個由它們的值通過某個函數計算出來的索引處。給定一個值v,你將以同樣的方式計算一個索引,並檢查值v是否在這裏。比檢查整個陣列快得多。

當然,在不同的值落在相同的地方有一個問題:衝突。需要一些魔力:完美哈希函數其係數被調整,所以來自初始集的值不會導致任何衝突。

相關問題