我在我的公司物流中面臨這個問題:
給定混合值陣列
arr = [
v1 => a,
v2 => b,
v3 => c,
v4 => d
]
按優先級 ASC 排序(v1 比 v2 更重要,...等)
我需要像這樣在表 t 中搜索值:
select * from t where
... And
t.v1 = a And
t.v2 = b And
t.v3 = c And
t.v4 = d
查詢中的 3 個點是固定條件
如果我無法從查詢中找到任何值,請執行相同的查詢,忽略陣列中最不重要的值
select * from t where
... And
t.v1 = a And
t.v2 = b And
t.v3 = c
如果沒有找到值。執行忽略下一個最不重要的值的查詢
select * from t where
... And
t.v1 = a And
t.v2 = b And
t.v4 = d
查詢可以忽略陣列中的所有元素作為最后一個查詢
select * from t where ...
重復此操作,直到找到至少 1 個查詢結果或陣列中的所有元素都為空且未找到任何結果。(回傳假)
我用二進制數做了我的搜索演算法來找到像這樣作業的值
binaryValue = (2 ^ arr.lenght) - 1 //(In this case: 2^4-1 = 15)
轉換布爾陣列中的二進制 15 exploded = [1, 1, 1, 1](二進制中的 15 是 1111)
比考慮 booleanArray 的位置 0 的查詢如果為真則爆炸然后考慮混合值的 arr 中的值等等
從 15 回圈到 0(第 0 次迭代是當布爾陣列為 [0,0,0,0] 并忽略所有情況時序列將是這樣的邏輯:
[a, b, c, d] // [1,1,1,1] = 15 (select * from t where ... and v1=a and v2=b and v3=c and v4=d)
[a, b, c] // [1,1,1,0] = 14 (select * from t where ... and v1=a and v2=b and v3=c)
[a, b, d] // [1,1,0,1] = 13 (select * from t where ... and v1=a and v2=b and v4=d)
...
[] // [0,0,0,0] = 0 (select * from t where ...)
搜索演算法作業正常,但我有一個巨大的性能問題。
此搜索中執行的查詢數為 arr.length!(fatorial) 所以當陣列長度為 4 時,最壞的情況是執行 24 次查詢。如果 arr.length 為 6(我現在在生產代碼中處理的長度是多少),最壞的情況會執行 720 次查詢,這是不可接受的。
我需要一種改進此搜索的方法。有人能幫我嗎?
提前致謝。
uj5u.com熱心網友回復:
我使用@RBarryYoung 建議的行的可取性概念提出了解決方案
我沒有執行多個查詢,而是將所有相關行提取到一個資料表(1 個查詢)中,并且對于每一行,我根據期望應用了一個分數。(代碼端)
Dim dicFields As New Dictionary(Of String, String) From { _
{"v1", a}, _
{"v2", b}, _
{"v3", c}, _
{"v4", d}
}
Dim intScore As Integer = dicFields.Keys.Count
For Each pair As KeyValuePair(Of String, String) In dicFields
lstRow _
.Where(Function(p) p.Item(pair.Key) = pair.Value) _
.ToList() _
.ForEach(Sub(p) p.Item("__Score") = intScore)
intScore -= 1
Next
return lstRow _
.OrderByDescending(Function(p) p.Item("__Score")) _
.FirstOrDefault()
它降低了 n! 的復雜度!只有 1 個查詢和 n 個過濾器。系統正常運行。感謝@RBarryYoung 的幫助
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/404906.html
標籤:
上一篇:使用React.js將平面地圖轉換為嵌套資料結構的最佳方法?
下一篇:在C 中快速列印出bitset
