2013-03-25 5 views
10

क्या कोई अंतर्निहित जावास्क्रिप्ट फ़ंक्शन partial sort करने के लिए है? यदि नहीं, तो इसे लागू करने का एक अच्छा तरीका क्या है?जावास्क्रिप्ट में आंशिक प्रकार

एन तत्वों की एक अवर्गीकृत सरणी देखते हुए, मैं कश्मीर तत्वों है कि कुछ भार समारोह के संबंध में कम से कम कर रहे हैं करना चाहते हैं। केएन से बहुत छोटा है, इसलिए यह पूरे सरणी को सॉर्ट करने और पहले के तत्वों को लेने में अक्षम होगा।

मैं कुछ भी गैर-मानक, ब्राउज़र-निर्भर होने पर भी खुश रहूंगा। मैं अभी भी कस्टम जावास्क्रिप्ट कार्यान्वयन में फॉलबैक कर सकता था।

पुनश्च: यह (खाते में एक भार समारोह लेने के लिए, बस के रूप में वे सादगी के लिए कर रहे हैं तत्वों छँटाई के बिना) मेरे वर्तमान कस्टम दिया गया है: एक ही समय दिया सरणी के माध्यम से

function bisect(items, x, lo, hi) { 
    var mid; 
    if (typeof(lo) == 'undefined') lo = 0; 
    if (typeof(hi) == 'undefined') hi = items.length; 
    while (lo < hi) { 
    mid = Math.floor((lo + hi)/2); 
    if (x < items[mid]) hi = mid; 
    else lo = mid + 1; 
    } 
    return lo; 
} 

function insort(items, x) { 
    items.splice(bisect(items, x), 0, x); 
} 

function partialSort(items, k) { 
    var smallest = []; 
    for (var i = 0, len = items.length; i < len; ++i) { 
    var item = items[i]; 
    if (smallest.length < k || item < smallest[smallest.length - 1]) { 
     insort(smallest, item); 
     if (smallest.length > k) 
     smallest.splice(k, 1); 
    } 
    } 
    return smallest; 
} 

console.log(partialSort([5, 4, 3, 2, 1, 6, 7, 8, 1, 9], 3)); 

एल्गोरिथ्म चलता है, नए तत्वों को सम्मिलित करने के लिए बाइनरी खोज का उपयोग करके के अब तक की सबसे छोटी वस्तुओं की क्रमबद्ध सूची का ट्रैक रखना।

यदि आप सोचते हैं कि वे तेज़ या अधिक सुरुचिपूर्ण हो सकते हैं तो कृपया वैकल्पिक समाधान पोस्ट करें। समय बहुत स्वागत है।

+0

मुझे स्पष्ट नहीं है कि के कैसे काम करता है। उदाहरण के लिए, क्या आप शीर्ष 20% की तलाश में हैं? –

+0

नहीं, यह स्थिर है, आमतौर पर * के * = 5, जबकि * एन * कई हजार हो सकता है। –

+0

तो, उदाहरण के लिए, आपके पास स्कोर के साथ हजारों प्रतियोगियों हैं, और आप जानना चाहते हैं कि शीर्ष 5 स्कोर किसके पास हैं? –

उत्तर

5

नहीं। केवल full array sort है, इसलिए आपको अपने स्वयं के कार्यान्वयन का उपयोग करने की आवश्यकता होगी।

अपने कोड पर

लिटिल सुधार (मैं बिल्कुल वैसा ही एल्गोरिथ्म :-) के बारे में सोचा था):

2

कोई देशी है (max चर कैशिंग करने के लिए यहां तक ​​कि seems to be a little faster, मैं वजह से लगता है)

function partialSort(items, k) { 
    var smallest = items.slice(0, k).sort(), 
     max = smallest[k-1]; 
    for (var i = k, len = items.length; i < len; ++i) { 
     var item = items[i]; 
     if (item < max) { 
      insort(smallest, item); 
      smallest.length = k; 
      max = smallest[k-1]; 
     } 
    } 
    return smallest; 
} 

आंशिक क्रम समारोह। आप जो चाहते हैं उसकी निकटतम चीज़ Array.filter है।

function isSmallEnough(element, index, array) { 
    return (element <= 10); 
} 
var filtered = [12, 5, 8, 130, 44].filter(isSmallEnough); 
// filtered is [5, 8] 

उदाहरण उपरोक्त लिंक से उधार लिया गया था (और थोड़ा संशोधित)।

+0

केवल समस्या यह है कि मुझे नहीं पता कि सीमा पहले से क्या होगी। बेशक, मैं * के * - न्यूनतम मूल्य * वी * पहले निर्धारित कर सकता हूं, फिर सरणी फ़िल्टर करें और इसे सॉर्ट करें। पता नहीं है कि पहले स्थान पर * वी * की खोज करते समय न्यूनतम तत्वों का ट्रैक रखने से तेज़ है या नहीं। –

+0

वी क्या है, यह जानने के लिए आपको प्रत्येक तत्व पर फिर से दोहराना पड़ सकता है, और उसके बाद वी। ओ (2 एन) से कम प्रत्येक तत्व को फ़िल्टर करने के लिए फिर भी पूरी सूची को हल करने से आपको बेहतर होगा: हे (एन लॉग एन)। –

+1

यह सबकुछ क्रमबद्ध करने से निश्चित रूप से तेज़ है, लेकिन मुझे यकीन नहीं है कि यह सरणी पर एक पास करने से तेज़ है, जहां मुझे अब तक * के * न्यूनतम तत्व याद हैं। यह सिद्धांत में कोई फर्क नहीं पड़ता (ओ (2 एन) = ओ (एन) के रूप में), लेकिन अभ्यास में एक महत्वपूर्ण अंतर कर सकता है। मै उसे करने की एक कोशिश तो करूंगा। –

संबंधित मुद्दे