讓我們從互動式解決方案開始。 表操作概括和加入可用於確定並集、交集和差集。 聯合是最簡單的,只需將所有內容放在一列中即可團體通過該欄。 刪除重複項後的並集顯示為結果表中的第一列。 要尋找交集,首先為每個輸入集建立一個單一列表,然後一次將兩個表連接在一起,確保包括不匹配項和丟棄倍數對於兩組。 您只需保留結果列之一,因為它們是相同的。 交集將是連接所有表後剩餘的行。 若要確定差異,請先建立所有集合的並集。 這將作為主列。 然後,將每個集合連接回主列,確保包含不符合項目(但仍刪除多個)。 缺失資料模式可用於識別每個集合的唯一值。 缺失資料模式表中只有一個 0 的行。
編寫此解決方案的腳本允許有一些選項。 獲取並集的一種簡單快速的方法是將所有值加載到列表中,然後使用概括尋找獨特的價值。 之前,我們已經看到連接向量可能會很慢,因此最好將其用於數字和字元。
令人驚訝的是,有一種更快的方法可以透過跳過列表並將數值直接載入到表中來將數值放入表中。 我是透過以下方式意識到這一點的@brady_brady在我們討論這個問題的過程中。 首先計算項目數,將那麼多行添加到表中,然後再次循環輸入以將值添加到表中。 快速檢查兩種資料載入方法顯示後者可以快 2-3 倍。 應用於兩個或多個集合的並集的兩種方法的範例在使用表格操作的聯合.JSL 。 在處理字元資料時,它僅提供了輕微的改進。
將資料載入到表中並進行匯總後,就會透過將每個集合連接回匯總資料來導出交集和差分運算。 如上所述,對於交叉點,如果我們加入,刪除多個並僅保留匹配項,最後連接的表將包含交集。 如果連接過程在任何時候產生一個沒有行的表(表示交集為空),則它會提前停止。 對於差異,保留不匹配項(但丟棄倍數)。 使用缺失資料模式可以發現差異。 有關如何對這些操作進行編碼的範例可在使用 Table Operations.JSL 設定函數
這與純腳本解決方案相比如何? 編寫並集、交集和差異腳本的一種快速而簡潔的方法是使用關聯數組及其伴隨的設定操作訊息(例如,相交和取得鑰匙)。 給出的一個例子是@jthi在上一篇文章中。 我在中提供了另一組範例使用 Associative Arrays.JSL 進行集合運算。 兩組函數看起來很相似,主要差異是我已經避免了遞迴。 儘管我很喜歡遞歸,但我擔心(正確或錯誤)如果遞歸太深,它會變慢。
我在不同的條件下進行了多次模擬,如下表所示,以比較關聯數組與表格操作的速度。 每個模擬均使用一組新的隨機產生值執行 10 次。 每組大小相同,由隨機整數或字串組成。 對於字元數據,Set Density 對應於字串長度,而對於數字數據,隨機整數的範圍設定為 10^Set Density。
資料類型:
|
數字或字符
|
集合元素的數量:
|
25、100、1000、1e4、1e5
|
套數:
|
2, 3, 5, 10, 25(僅 2 個用於差異)
|
設定密度:
|
2, 3, 4, 5, 6
表示字串長度或10 X整數
|
下圖總結了結果。 彩色方塊對應於一種方法在 10 次重複中至少有 9 次表現出優越時間的情況。 任何不足都被視為平局。 750 個案例中,除了 15 個案例外,其餘所有案例都有明確的結果,其中關聯數組排名第一的頻率大約是關聯數組的兩倍。 也顯示更快方法的中位數時間以及處理時間的改善(更慢的時間/更快的時間)。 只有當中位數絕對差異(一組條件下 10 次運行之間的中位數差異)為 0.5 秒或以上時,才會顯示這些值。 因此,雖然關聯陣列方法更容易獲勝,但許多時間差異都在半秒或更短。 值得注意的例外是與整數資料的交集:隨著資料集變大和集數增加,差異似乎會增加。 然而,字元資料的情況正好相反,其中資料表操作要快得多。 從結果中我們可以看出,表格操作是幾乎所有字元資料類型和超過 100 個成員的數值資料的 Union 方式。 完整的結果可以在挑戰9結果1.JMP並總結為獲獎者 1.JMP 。

我們也許能夠走得更快(至少對於整數資料)。 在先前的模擬中,在涉及數值資料交集和差集的所有條件下,關聯數組方法都優於表格操作。 然而,如果我們採用查找矩陣方法,這種優勢就會減弱。 這種方法的一個例子可以在使用矩陣.JSL 進行集合運算是由於@brady_brady 。 下圖顯示,對於 10,000 或更大的集合,矩陣方法在所有差異條件下都顯示出較小的優勢(<0.5 秒),並且在交集的大約一半情況下具有優勢。 也就是說,關聯數組方法的簡單性使我比其他方法更喜歡它。 完整的模擬結果可以在挑戰9結果2.JMP並總結為獲獎者2.JMP 。 表運算和矩陣的差異例程很容易擴展到兩組以上的數據。
