मैं एक खेल को मजबूर कर रहा हूं और मुझे सभी पदों और परिणामों के लिए डेटा स्टोर करने की आवश्यकता है। डेटा आकार में सैकड़ों जीबी की संभावना होगी। मैंने एसक्यूएल माना, लेकिन मुझे डर है कि एक तंग पाश में लुकअप प्रदर्शन को मार सकता है। कार्यक्रम संभावित पदों पर फिर से शुरू होगा और यदि यह ज्ञात हो तो विजयी कदम वापस लौटाएगा, अगर सभी चालें खोने के लिए जानी जाती हैं और अज्ञात चाल के परिणाम देखने की आवश्यकता होती है तो सबसे लंबे समय तक हारने का अनुक्रम वापस लौटाएं।कुशल जावा मानचित्र को कुशलतापूर्वक कैसे स्टोर करें?
बड़े Map<Long,Long[]> positionIdToBestMoves
को स्टोर करने का सबसे अच्छा तरीका क्या है? मैं एसक्यूएल या डेटा क्रमबद्धता पर विचार कर रहा हूं।
मैं जावा में सभी व्यवहार्य चालों को मजबूर करने के लिए छोटे चेकर्स को हल करना चाहता हूं। पदों की ऊपरी सीमा लगभग 100 अरब है। उनमें से अधिकतर व्यावहारिक नहीं हैं (यानी खेल की शुरुआत में मौजूद थे से अधिक टुकड़े)। कुछ 10 बिलियन एक उचित अनुमान है। प्रत्येक Map<Long, Long[]> position
मानचित्र Long positionID
से Long whiteToMove
और Long blackToMove
। सकारात्मक मूल्य इंगित करता है कि स्थिति जीत रही है और एक चाल जो मूल्य में संग्रहीत स्थिति की ओर ले जाती है उसे चुना जाना चाहिए। नकारात्मक मान -n
का अर्थ है कि n
चालों में स्थिति खो रही है।
//this is a stub
private Map<Long, Long[]> boardBook =...
//assuming that all winning positions are known
public Long nextMove(Long currentPos, int whiteOrBlack){
Set<Long> validMoves = calculateValidMoves(currentPos, whiteOrBlack);
boolean hasWinner = checkIfValidMoveIsKnownToWin(validMoves, whiteOrBlack);
if(hasWinner){ //there is a winning move - play it
Long winningMove = getWinningMove(validMoves, whiteOrBlack);
boardBook.get(currentPos)[whiteOrBlack] = winningMove ;
return winningMove ;
}
boolean areAllPositionsKnown = checkIfAllPositionsKnown(validMoves, whiteOrBlack);
if(areAllPositionsKnown){ //all moves are losing.. choose longest struggle
Long longestSequenceToDefeat = findPositionToLongestSequenceToDefeat(validMoves, whiteOrBlack);
int numberOfStepsTodefeat = boardBook.get(longestSequenceToDefeat)[whiteOrBlack];
boardBook.get(currentPos)[whiteOrBlack] = longestSequenceToDefeat ;
return longestSequenceToDefeat;
}
Set<Long> movesToCheck = getUntestedMoves(validMoves, whiteOrBlack);
Long longeststruggle;
int maxNumberOfMovesToDefeat =-1;
for(Long moveTocheck : movesToCheck){
Long result = nextMove(moveToCheck, whiteOrBlack);
if(result>0){ //just discovered a winning move
boardBook.get(currentPos)[whiteOrBlack] = winningMove ;
return winningMove ;
}else {
int numOfMovesToDefeat = -1*boardBook.get(moveTocheck)[whiteOrBlack];
if(numOfMovesToDefeat >maxNumberOfMovesToDefeat){
maxNumberOfMovesToDefeat =numOfMovesToDefeat ;
longeststruggle = moveTocheck;
}
}
}
boardBook.get(currentPos)[whiteOrBlack] = -1*maxNumberOfMovesToDefeat;
return longeststruggle;
}
दिलचस्प सवाल। उत्तर देने के लिए मेरे कौशल से परे लेकिन आप जो भी वर्णन करते हैं वह पारंपरिक एसक्यूएल के बजाय बड़े डेटा/नोएसक्यूएल समाधान के क्षेत्र की तरह लगता है। – Gimby