मेरे पास उन तत्वों की एक बड़ी सूची है जिन्हें मैं यादृच्छिक क्रम में पुन: सक्रिय करना चाहता हूं। हालांकि, मैं सूची को संशोधित नहीं कर सकता और मैं इसकी प्रतिलिपि बनाना भी नहीं चाहता, क्योंकि 1) यह बड़ा है और 2) यह उम्मीद की जा सकती है कि पुनरावृत्ति को रद्द कर दिया जाए।आलसी शफल एल्गोरिदम
List<T> data = ...;
Iterator<T> shuffled = shuffle(data);
while (shuffled.hasNext()) {
T t = shuffled.next();
if (System.console().readLine("Do you want %s?", t).startsWith("y")) {
return t;
}
}
System.out.println("That's all");
return t;
मैं एक एल्गोरिथ्म रहा हूँ थे कोड ऊपर O(n)
में काम कर (और अच्छा होगा यदि केवल O(log n)
स्थान की आवश्यकता), इसलिए तत्वों है कि पहले तैयार किए गए एक विकल्प नहीं है भंडारित करता है। मुझे परवाह नहीं है कि एल्गोरिदम पक्षपातपूर्ण है (जब तक यह स्पष्ट नहीं है)।
(मैं अपने सवाल में छद्म जावा का उपयोग करता है, लेकिन आप यदि आप चाहें तो अन्य भाषाओं का उपयोग कर सकते हैं)
यहाँ सबसे अच्छा मैं अब तक मिल गया है।
Iterator<T> shuffle(final List<T> data) {
int p = data.size();
while ((data.size() % p) == 0) p = randomPrime();
return new Iterator<T>() {
final int prime = p;
int n = 0, i = 0;
public boolean hasNext() { return i < data.size(); }
public T next() {
i++; n += prime;
return data.get(n);
}
}
}
पुनरावृत्ति O(n)
के सभी तत्वों, निरंतर अंतरिक्ष, लेकिन स्पष्ट रूप से पक्षपाती के रूप में यह केवल data.size()
क्रमपरिवर्तन उत्पादन कर सकते हैं।
हो सकता है कि यह आप एक संकेत दे सकता है।कॉम/प्रश्न/352203/जनरेटिंग-क्रमपरिवर्तन-आलसी – dsd
उत्तर स्टीनहॉस-जॉनसन-ट्रॉटर एल्गोरिदम लगता है, जो सभी क्रमिक क्रमशः उत्पन्न करता है। मैं एक एकल (यादृच्छिक रूप से चुने गए) क्रमपरिवर्तन की तलाश में हूं, इसे आसानी से निर्मित करें। – Cephalopod
इस साइट पर एक समान प्रश्न का उत्तर अनुक्रम 0, 1, 2, एन्क्रिप्ट करने के लिए परिवर्तनीय ब्लॉक आकार के साथ एन्क्रिप्शन एल्गोरिदम का उपयोग करने का सुझाव दिया गया है ... http://stackoverflow.com/a/18185810/154770 –