मैं क्रमबद्ध सूचियों को एक सूची में विलय करना चाहता हूं। यह समाधान कैसा है? मेरा मानना है कि यह ओ (एन) समय में चलता है। कोई चमकदार त्रुटियां, अक्षमता, या स्टाइलिस्ट मुद्दों?जावा कोड समीक्षा: क्रमबद्ध सूचियों को एक क्रमबद्ध सूची में मर्ज करें
मुझे वास्तव में "यह पहला पुनरावृत्ति" के लिए ध्वज स्थापित करने की मुहावरे पसंद नहीं है और यह सुनिश्चित करने के लिए "निम्नतम" का डिफ़ॉल्ट मान है। क्या इसके चारों ओर एक बेहतर तरीका है?
public static <T extends Comparable<? super T>> List<T> merge(Set<List<T>> lists) {
List<T> result = new ArrayList<T>();
int totalSize = 0; // every element in the set
for (List<T> l : lists) {
totalSize += l.size();
}
boolean first; //awkward
List<T> lowest = lists.iterator().next(); // the list with the lowest item to add
while (result.size() < totalSize) { // while we still have something to add
first = true;
for (List<T> l : lists) {
if (! l.isEmpty()) {
if (first) {
lowest = l;
first = false;
}
else if (l.get(0).compareTo(lowest.get(0)) <= 0) {
lowest = l;
}
}
}
result.add(lowest.get(0));
lowest.remove(0);
}
return result;
}
नोट: यह होमवर्क नहीं है, लेकिन यह उत्पादन कोड के लिए नहीं है।
"ढेर" एल्गोरिदम देखें। – Anton
मुझे लगता है कि आपका कार्यान्वयन ठीक है, लेकिन एल्गोरिदमिक जटिलता के बारे में एक नोट: इनपुट सूचियों की निरंतर संख्या मानते हुए, यह ओ (एन) है। लेकिन चूंकि आपकी विधि इनपुट सूचियों की मनमानी संख्या को संभाल सकती है, इसलिए रन-टाइम ओ (एम * एन) है - आपको खाते की चर संख्या को ध्यान में रखना होगा। यदि एम> लॉग 2 (एन) +1 (मुझे लगता है), तो यह वास्तव में सभी सूचियों को संयोजित करने और उन्हें विलय करने के लिए तेज़ होगा, जो ओ (एन * लॉग 2 (एन)) लेता है। यह अक्सर मामला होने की संभावना नहीं है, लेकिन यह ध्यान देने योग्य है। – Dathan
यह मानक मर्ज-सॉर्ट कोड है। आप शायद अपने लूप को http://www.google.com/codesearch#search/&q=merge%5C%20sort&type=cs पर अनुकूलित करने के तरीके के लिए प्रेरणा पा सकते हैं। आपको उस 'पहले' बुलियन की आवश्यकता नहीं होनी चाहिए। –