生成 Successor 元素的算法沒有使用任何特別的技巧。實質上你從最右邊的元素開始向左移動直到你定位于應該增加的最左邊的原子。這時你以索引 i 增加原子并重新安排所有原子到 i 的右邊比左邊的值大 1。舉個例子,設 n = 5 和 k = 3 并且你想得到組合{ 0, 3, 4 }的后繼者。索引 i 開始于地址 2(指向值為 4 的原子),并且左移直到它到地址 0(指向值為 0 的原子)。原子值被加1,并且右邊(3 和 4)的所有原子從數組左邊的值增加,得到結果{ 1, 2, 3 }。
一旦你有了 Successor 方法,便需要一個 ApplyTo 方法,它將某個組合元素放到一個字符串數組中。ApplyTo 方法很簡單:
public string[] ApplyTo(string[] strarr) { if (strarr.Length != this.n) throw new Exception("Bad array size"); string[] result = new string[this.k]; for (long i = 0; i < result.Length; ++i) result[i] = strarr[this.data[i]]; return result; }
通過對字符串數組輸入參數的檢查,確保字符串個數的正確性之后,用子集 k 的大小創建一個結果數組。然后遍歷輸入字符串 ,并將一個引用存儲到結果數組相應的單元中。與組合所實現的許多操作一樣,如果你不從頭到尾跟蹤一兩個例子,所發生的事情并不是那么顯而易見。
根據適當的條目數和子集大小實例化一個 Combination 對象之后,創建一個字符串數組來保存結果組合元素。用一個 While 循環來遍歷所有組合元素——回想一下我們曾說過,當 不存下一個元素時,Successor 方法返回 null——并且 ApplyTo 方法將當前元素映射到原始字符串數組上。
結束語
在計劃和進行配置測試的過程中,組合是一個不可或缺的工具,尤其是在被稱為交互式分析的子領域里。舉個例子,假設你需要在一臺安裝了多個瀏覽器和多媒體播放器 的機器上測試產品。你想要從八個瀏覽器集合中選裝三個瀏覽器,從六個多媒體播放器集合中選裝兩個播放器來進行系統結合測試。這里有多少配置的組合呢?你怎樣才能 編寫程序列出這些配置?本文呈現的技術使得你很容易就計算出有 Choose(8,3) * Choose(6,2) = 840 個可能的測試配置。它也讓你很容易編程列出所有這些配置。
在檢查和測試執行路徑時,組合是很有用的。我將用一個經典的問題來舉例說明,它是一個分析執行路徑的代理(微軟常用這種例子問題來對測試工程師候選 人進行面試)。假設你在開發一個游戲。玩家進入一個鋪了地板磚的房間的西南角。玩家必須通過移動一塊地磚到東邊或移動一塊地磚到北邊以便自己移動到房間的東北角(換句話說玩家總是向出口方向移動并且不能 走回頭路)。如果這個房間很小-只有 10 塊地磚長 6 塊地磚那么寬——玩家會有多少種不同的路徑走法?你能測試所有這些路徑嗎?如果移動到東邊用字母 E 代表而移動到北邊用字母 N 代表,一個到出口的可能路徑就是玩家先向東移動所有步然后一直向北:
E E E E E E E E E E N N N N N N
一個不同的路徑是:
E N E N E N E N E N E N E E E E
注意這里玩家無論怎么移動,總是恰好只有16步。還要注意你可以認為移動一步為“E”或“not E”。如果你想象16格的一個序列,你必須用“E”填滿16格中的10格 (因為剩下的格子一定為“N”)。因此,這個問題的答案是這里有 Choose(16,10) = 8,008 個可能路徑,并且你可以用本文示例代碼輕松地生成它們。
正如我早先說過的,測試是軟件開發的一個極其重要的方面。下次還是在這里,我將給你提供更多的技巧應用到你的測試過程中。
文章來源于領測軟件測試網 http://www.kjueaiud.com/