我使用C++中的所有可打印字符進行替換來編碼經典密碼,我想知道哪個更快?在一個數組中搜索(編輯:一個非關聯的,只是像letters[] = {'a', 'b', ...);
(線性或二進制)或switch語句?編譯器可以優化開關,不是嗎?也許不同是內存使用?我的選擇是開關,雖然代碼更大,但也許我錯過了一些東西。搜索數組或開關?對於通過替換的密碼
(也許這個問題似乎是主觀的,但我認爲會客觀的原因選擇一種或另一種方式。 )
我使用C++中的所有可打印字符進行替換來編碼經典密碼,我想知道哪個更快?在一個數組中搜索(編輯:一個非關聯的,只是像letters[] = {'a', 'b', ...);
(線性或二進制)或switch語句?編譯器可以優化開關,不是嗎?也許不同是內存使用?我的選擇是開關,雖然代碼更大,但也許我錯過了一些東西。搜索數組或開關?對於通過替換的密碼
(也許這個問題似乎是主觀的,但我認爲會客觀的原因選擇一種或另一種方式。 )
確實有一個機會,一個足夠聰明的編譯器可以優化切換爲查找,這比二進制搜索更快。但你可以自己做這種優化,並得到短代碼:
char alphabet[] = {
'Z', 'E', 'B', 'R', 'A', 'S', 'C', 'D', 'F', 'G', 'H', 'I', 'J',
'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'T', 'U', 'V', 'W', 'X', 'Y'
};
// now you can get the ciphertext for a single uppercase character with:
alphabet[ch - 'A'];
爲什麼你需要搜索?只需要一個由你的ASCII字符索引的128條數組,這基本上就是編譯器用你的開關做的事情(你可以減去32並使用一個96條數組,非printables使用的空間。)
+1,我寫的完全一樣(: – 2011-06-04 14:36:00
)你有沒有看過爲彙編語句生成的程序集?編譯器不使用數組來實現開關,它們使用偏移跳轉 – 2011-06-04 14:37:37
@Vlad:GCC有時也使用二叉樹 – 2011-06-04 14:43:22
哪一個更快取決於很多因素:編譯器的優化(您必須查看程序集以瞭解它的作用)以及如何設置陣列。
如果性能非常重要,而且兩個解決方案的實現都相當簡單,那麼我會實施它們並在儘可能真實的設置中對它們進行基準測試,以確定哪個解決方案更快。
爲什麼你需要搜索一個數組?沒有太多的ASCII字符。將替換存儲在一個表中,並且查找由單個數組查找組成。 – sigfpe 2011-06-04 14:34:31
@ user207442我沒有使用關聯數組,因爲我們還沒有在課上研究它們。 – Tae 2011-06-04 20:43:27