我需要在vb6中的單個數組上運行「模式」(該值最常出現)。在大型數組上執行此操作有沒有一種快速方法?是否有一種簡單的方法在vb6中的單個數組上具有「模式」功能?
回答
有一個體面的實施VB6排序算法的上網一看(我不能相信它不具有一個內置的!),排序數組,然後通過它計數出現(這將直截了當,因爲你已經將所有相同的物品放在一起) - 記錄你正在經歷的最頻繁發生的物品,並且完成。這應該是O(n ln(n)) - 即足夠快 - 如果你使用了一個體面的排序算法(quicksort或類似的)。
你可以使用一個哈希表。散列數組的所有元素(即O(n))。您需要一個後端數據結構來保存每個哈希bin包含的唯一值和發生次數(類似於C++ std :: map的某種關聯內存)。只要你可以保證在任何給定的bin中不會有超過常數的m個碰撞(對於不同的散列輸入值),這就是O(m log m),但是因爲m是常數,所以真的是O(1)。這個假設可能不合理,但關鍵是要獲得足夠的分佈以適合您的輸入值。
拉出模式,檢查所有在哈希表中的元素,這將是發生在你原來的輸入數組和他們發生次數值。找到發生次數最多的值(再次O(n))。如果可以找到合適的散列函數,則總複雜度爲O(n)。如果散列函數不能爲您提供良好的碰撞性能,最差情況下的性能將爲O(n log n)。
在另一方面,淨提供了大量的運行時庫,可能使這更容易。如果可行,你可能會考慮使用VB的新版本。
謝謝,我要支持一個巨大的傳統VB6應用程序,所以我不併不總會有.NET – cabgef 2010-07-19 13:16:41
包括以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
豪華的耐性是關鍵這裏恕我直言,這不是真正清楚,浮點型的模式是有道理的,除非你有一個耐性來比較 – 2010-07-19 14:05:53
謝謝,好點的,這就是爲什麼我四捨五入它到2位小數,這解決了我目前的需求。 – cabgef 2010-07-20 02:30:43
請注意,Round使用銀行家的舍入,這可能會也可能不合適。 你也可以通過使用一個直的數組來保存一個單獨排列的唯一列表(以及一個單獨的數組來保存相應的計數),以便更快地完成任務。然後使用二進制搜索來查找Single值。 – 2010-07-20 16:11:33
- 1. 在回憶錄課程中是否有一種快速獲取titlesec「簡單模式」功能的方法?
- 2. 是否有一個有效的\簡單的方法在Direct3D
- 3. 有一種簡單的方式QTCaptureSession
- 4. 是否有一種清理管道的簡單方法C
- 5. 是否有一種簡單的方法來強制String.split()返回具有空字符串元素的數組?
- 6. 是否有沒有模型的數組後表單的方法?
- 7. 有沒有一種簡單的方法在Fortran中查找索引數組零?
- 8. 是否有一種語言具有這種簡化的語法?
- 9. 是否有一種更簡單的方法來克隆具有數十個成員變量的對象?
- 10. 在PHP中,是否有一種簡單的方法來判斷URL是否爲單個文件資源?
- 11. 是否有某種方式簡單地執行每個元素?
- 12. 在Rails中,是否有一種簡單的方法來檢查ActiveRecord的屬性?
- 13. 有沒有一種簡單的方法在Python中編寫它?
- 14. MVC3 Url.Action() - 是否有一種簡單的方式在MVC3中編寫鏈接?
- 15. 是否有一種簡單的方法來從兩個整數組合鍵創建唯一的整數鍵?
- 16. 是否有更簡單的方法來更改單個數組值?
- 17. 是否有一種比較大型物品清單的更簡單方法?
- 18. 找出所有數組值是否爲空的簡單方法?
- 19. 有沒有一種簡單的方法來分配一組變量到每個數組的值在PHP中?
- 20. JavaScript中的30個數組有沒有簡單的方法?
- 21. 是否有一個簡單的解決方案「排除/隱藏」功能的div?
- 22. 有沒有一種簡單的方法來document.createElement多個元素?
- 23. 有沒有一種簡單的方法在iPhone上創建模式按鈕菜單?
- 24. Libgdx:是否有一種簡單的方法可以在按鈕上的每個軸上居中文本?
- 25. 是否有一種簡單的方法可以將int轉換爲每個數字的整數數組?
- 26. 是否有一種簡單(慣用)的方式將java.lang.reflect.Method轉換爲Scala函數?
- 27. 有沒有一種簡單的方法來檢查字段是否爲null?
- 28. 是否有一種簡單的方法可以將組限制在2個屏幕上?
- 29. 有沒有一種更簡單的方法來在XNA中動畫3D模型?
- 30. 是否有一種簡單的方法來刪除列表項中的空白
+1下面是一些排序算法從StackOverflow的http://stackoverflow.com/questions/152319/vba-array-sort-function – MarkJ 2010-07-22 11:51:58