我正在構建一個游戲,用戶可以從一個符號串列中進行選擇,然后識別這些選擇是什么。
例如:
符號。[A, B, C, D, E, F, G]
用戶選擇了[B, F, G],這個代表陣列[0, 1, 0, 0, 0, 1, 1]被保存在資料庫中
當用戶正確地復制了一個選擇時,我希望能夠在選擇是唯一的情況下給予獎勵積分。
我所說的獨一無二是指該選擇與之前所有的選擇有足夠的不同。 到目前為止,我所考慮的是將用戶的選擇陣列與之前的所有選擇進行比較,并檢查 "差異 "是否至少是某個 X 值
示例
示例 以前的選擇:
<醇>用戶的選擇。 [0, 1, 0, 0, 0, 1, 1]
將用戶的選擇陣列與之前的陣列進行比較,找出有多少個索引不同
1)
[0, 1, 0, 0, 0, 1, 1]
[1, 1, 0。0, 0, 0, 0] ---- 方差 = 3]
2)
[0, 1, 0, 0, 0, 1, 1]
[0, 1, 0。0, 0, 0, 0] ---- 方差=2]
對于3的最小方差(X),這個用戶沒有得到任何獎勵積分 但對于2,他可以得到
是否有更好的方法來考慮和實作這個問題?編輯部
為了澄清這一點。我打算將最小方差設定為3。 因此,在計算了用戶的規則和所有其他現有規則之間的差異后,如果發現的最小差異大于3,用戶就會獲得獎勵積分,否則就不會。
uj5u.com熱心網友回復:
你有一個大小為7的集合--> [A, B, C, D, E, F, G],你只能有2^7=128個可能的代表陣列的前值。
只要你有一個有效的查詢來從資料庫中選擇不同的代表陣列,你的演算法就應該運行得非常快,即使它不是最好的時間復雜度演算法。也許不值得讓你的演算法變得更復雜,但這里有一個很好的方法,在你做完新選擇& 前選擇后找到方差:計算二進制表示法中的1的數量
在我看來,你應該更加關注從資料庫中檢索以前的不同陣串列示。你可以通過為你的表示創建一個uniq哈希值,并將其與之前的表示一起存盤。對于這個問題,你有一個很好的函式來做,只需計算你的代表的十進制值,如下所示:
0 = [0, 0, 0, 0, 0, 0, 0] = 0 * 2^0 0 * 2^1 0 * 2^2 0 * 2^3 0 * 2^4 0 * 2^5 0 * 2^6
1 = [1, 0, 0, 0, 0, 0。0] = 1 * 2^0 0 * 2^1 0 * 2^2 0 * 2^3 0 * 2^4 0 * 2^5 0 * 2^6
.
.
.
127 = [1, 1, 1, 1, 1, 1, 1] = 1 * 2^0 1 * 2^1 1 * 2^2 1 * 2^3 1 * 2^4 1 * 2^5 1 * 2^6
當你選擇不同的值時,它將保證你做的比較不超過128次
。uj5u.com熱心網友回復:
我認為你正在尋找XOR ^運算子,然后你可以計算 "1 "的數量來找到差異。你不需要在資料庫中存盤陣列,它可以只是一個簡單的INT型別列。
在你的例子中:
1)
0100011 -> 35)
1100000 -> 96
那么在javascript中你可以做到:
a = parseInt("0100011"/span>, 2)。 //它將給出35(只存盤35為INT)。
b = parseInt("1100000", 2); //會得到96(只將96作為INT存盤)。
//以后當你想計算方差時。
varDec = a ^ b; //varDec = 67
varBin = varDec.toString(2) //varBin = "1000011"
然后你應該計算varBin變數中的 "1 "的數量。在SO上有一些關于這個問題的答案(例如:如何找到一個數字的二進制表示中的1的數量?)
variance = varBin.split('1'/span>)。 length-1; // variance = 3。
uj5u.com熱心網友回復:
我可能在這里錯過了什么,但這聽起來是一個相當簡單的問題。 我們需要一個函式來計算兩個陣列中的元素不匹配的索引數,稱之為variance,我們還需要一個函式,針對當前的選擇與之前的串列進行運算,并獲取最小值,稱之為minVariance。 這個代碼段有這兩個函式的相當簡單的版本:
const variance = (xs) => (ys) =>
xs .reduce ((c, x, i) =>/span> x == ys [i] ? c : c 1, 0)
const minVariance = (curr) => (prevs) => /span>
數學 .min (... prevs .map (variance (curr))
const prevs = [...
[1, 1, 0, 0, 0, 0, 0】。]
[0, 1, 0。0, 0, 0, 0] 。
]
const curr = [0, 1, 0, 0, 0, 1, 1]
console .log (minVariance (curr) (prefs))
<iframe name="sif1" sandbox="allow-forms allow-modals allow-scripts" class="snippet-box-edit snippet-box-result" frameborder="0"></iframe>
正如其他人所指出的,有一些技術可能會幫助你進一步節省存盤成本,但最終你將需要比較位圖或整數,或者轉換為你已經計劃好的陣列。 我們的minVariance對于這些可以保持不變,只改變簡單的variance。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/308834.html
標籤:
上一篇:使用單線演算法的二維纖維排列
