2010-07-18 90 views

回答

2

有一個體面的實施VB6排序算法的上網一看(我不能相信它不具有一個內置的!),排序數組,然後通過它計數出現(這將直截了當,因爲你已經將所有相同的物品放在一起) - 記錄你正在經歷的最頻繁發生的物品,並且完成。這應該是O(n ln(n)) - 即足夠快 - 如果你使用了一個體面的排序算法(quicksort或類似的)。

+0

+1下面是一些排序算法從StackOverflow的http://stackoverflow.com/questions/152319/vba-array-sort-function – MarkJ 2010-07-22 11:51:58

2

你可以使用一個哈希表。散列數組的所有元素(即O(n))。您需要一個後端數據結構來保存每個哈希bin包含的唯一值和發生次數(類似於C++ std :: map的某種關聯內存)。只要你可以保證在任何給定的bin中不會有超過常數的m個碰撞(對於不同的散列輸入值),這就是O(m log m),但是因爲m是常數,所以真的是O(1)。這個假設可能不合理,但關鍵是要獲得足夠的分佈以適合您的輸入值。

拉出模式,檢查所有在哈希表中的元素,這將是發生在你原來的輸入數組和他們發生次數值。找到發生次數最多的值(再次O(n))。如果可以找到合適的散列函數,則總複雜度爲O(n)。如果散列函數不能爲您提供良好的碰撞性能,最差情況下的性能將爲O(n log n)。

在另一方面,淨提供了大量的運行時庫,可能使這更容易。如果可行,你可能會考慮使用VB的新版本。

+0

謝謝,我要支持一個巨大的傳統VB6應用程序,所以我不併不總會有.NET – cabgef 2010-07-19 13:16:41

2

包括以Microsoft腳本運行時的參考,以及用於Dictionary對象以保持頻率的訊號,然後尋找指數最高頻率和對應的鍵是模式。不是最快捷/最優雅的解決方案,但我只需要快速的工作。

Function fnModeSingle(ByRef pValues() As Single) As Single 
    Dim dict As Dictionary 
    Set dict = New Dictionary 
    dict.CompareMode = BinaryCompare 
    Dim i As Long  
    Dim pCurVal As Single 
    For i = 0 To uBound(pValues) 
    'limit the values that have to be analyzed to desired precision' 
     pCurVal = Round(pValues(i), 2) 
      If (pCurVal > 0) Then 
       'this will create a dictionary entry if it doesn't exist 
       dict.Item(pCurVal) = dict.Item(pCurVal) + 1 
      End If 
    Next 

    'find index of first largest frequency' 
    Dim KeyArray, itemArray 
    KeyArray = dict.Keys 
    itemArray = dict.Items 
    pCount = 0 
    Dim pModeIdx As Integer 
    'find index of mode' 
    For i = 0 To UBound(itemArray) 
     If (itemArray(i) > pCount) Then 
      pCount = itemArray(i) 
      pModeIdx = i 
     End If 
    Next 
    'get value corresponding to selected mode index' 
    fnModeSingle = KeyArray(pModeIdx) 
    Set dict = Nothing 

End Function 
+0

豪華的耐性是關鍵這裏恕我直言,這不是真正清楚,浮點型的模式是有道理的,除非你有一個耐性來比較 – 2010-07-19 14:05:53

+0

謝謝,好點的,這就是爲什麼我四捨五入它到2位小數,這解決了我目前的需求。 – cabgef 2010-07-20 02:30:43

+0

請注意,Round使用銀行家的舍入,這可能會也可能不合適。 你也可以通過使用一個直的數組來保存一個單獨排列的唯一列表(以及一個單獨的數組來保存相應的計數),以便更快地完成任務。然後使用二進制搜索來查找Single值。 – 2010-07-20 16:11:33

相關問題