2016-10-14 11 views
5
आइटम निकाल सरणी के माध्यम से कई बार दोहराने में

कल्पना कीजिए मैं संख्या की एक सरणी के रूप में निम्नानुसार है:सबसे तेजी से रास्ता है, जबकि

var myArray = [1, 2, 3, 4, 5];

यह एक सरलीकरण, मेरे वास्तविक स्थिति बहुत बड़ा (60K या अधिक आइटम) है।

असल में मुझे कुछ संख्याओं को संसाधित करने के लिए पूरी तरह से सरणी के माध्यम से पुनरावृत्ति करने की आवश्यकता है और फिर सभी संख्याओं को संसाधित होने तक पूरी तरह से सरणी के माध्यम से पुनरावृत्ति करना जारी रखें (कहें कि मैं पहले पुनरावृत्ति पर 1 और 3 को संसाधित कर सकता हूं और 2 , दूसरे पर 4 और 5)। संपादित करें: उन्हें क्रमिक क्रम में होना जरूरी नहीं है।

मुझे क्या आश्चर्य है - मुझे इसे बनाने की आवश्यकता है ताकि आइटम जो पिछले पुनरावृत्तियों में संसाधित हो चुके हैं, को फिर से पर विचार नहीं किया जाएगा।

मेरा प्रश्न है: क्या यह करने के लिए सबसे तेज़ तरीका है, इस वजह से हर एमएस में गिना जाता है एक बड़े पैमाने पर किया जा रहा है।

मैं आइटम कि myArray = myArray.splice(i, 1) करके संसाधित किया गया है, लेकिन वह बेहद धीमी गति से है को दूर करने की कोशिश की है। मैंने प्रसंस्कृत वस्तुओं को null पर सेट करने का प्रयास किया है और फिर बाद के पुनरावृत्तियों पर null आइटमों को अनदेखा कर दिया है। यह विधि तेजी से काम करने लगती है लेकिन अभी भी एक या दो लेती है। क्या कुछ तेज विधि है?

+0

आप प्रसंस्करण से पहले सॉर्ट सकते हैं और फिर आगे बढ़ने के लिए एक दिए गए इंडेक्स पर शुरू करते हैं। या, आप संसाधित अंतिम संख्या को संग्रहीत कर सकते हैं और एक सरल> तुलना कर सकते हैं। – rockerest

+0

दुर्भाग्य से सॉर्टिंग कई कारणों से एक विकल्प नहीं है। संख्या सिर्फ एक उदाहरण थे। मैं वास्तव में एलएबी रंग मूल्यों को संसाधित कर रहा हूं। – abagshaw

+1

हमें अधिक प्रसंस्करण दिखाएं। संभावना है कि वहां – charlietfl

उत्तर

-2
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.0/jquery.min.js"></script> 
<script type="text/javascript"> 
    $(document).ready(function() { 
     getColorGroup(); 
    }); 
    function getColorGroup() 
    { 
     var colors = ['#FAEBD7', '#00FFFF', '#000000', '#0000FF', '#8A2BE2', '#A52A2A', '#DEB887', '#5F9EA0', '#7FFF00', '#D2691E', '#FF7F50', '#6495ED', '#DC143C', '#00FFFF', '#00008B', '#008B8B', '#B8860B', '#A9A9A9', '#A9A9A9', '#006400', '#BDB76B', '#8B008B', '#556B2F', '#FF8C00', '#9932CC', '#8B0000', '#E9967A', '#8FBC8F', '#483D8B', '#2F4F4F', '#2F4F4F', '#00CED1', '#9400D3', '#FF1493', '#00BFFF', '#696969', '#696969', '#1E90FF', '#B22222', '#228B22', '#FF00FF', '#DCDCDC', '#FFD700', '#DAA520', '#808080', '#808080', '#008000', '#ADFF2F', '#FF69B4', '#CD5C5C', '#4B0082', '#F0E68C', '#E6E6FA', '#7CFC00', '#00FF00', '#32CD32', '#FF00FF', '#800000', '#66CDAA', '#0000CD', '#BA55D3', '#9370DB', '#3CB371', '#7B68EE', '#00FA9A', '#48D1CC', '#C71585', '#191970', '#FFE4E1', '#FFE4B5', '#FFDEAD', '#000080', '#808000', '#6B8E23', '#FFA500', '#FF4500', '#DA70D6', '#EEE8AA', '#98FB98', '#AFEEEE', '#DB7093', '#FFDAB9', '#CD853F', '#FFC0CB', '#DDA0DD', '#B0E0E6', '#800080', '#663399', '#FF0000', '#BC8F8F', '#4169E1', '#8B4513', '#FA8072', '#F4A460', '#2E8B57', '#A0522D', '#C0C0C0', '#87CEEB', '#6A5ACD', '#708090', '#708090', '#00FF7F', '#4682B4', '#D2B48C', '#008080', '#D8BFD8', '#FF6347', '#40E0D0', '#EE82EE', '#F5DEB3', '#FFFF00', '#9ACD32']; 
     var randomIndex = Math.floor(Math.random() * 1000 % colors.length); 
     var color = colors[randomIndex]; 
     console.log(color); 
     var tasks = []; 
     for (var i = 0; i < colors.length; i += 10) 
     { 
      tasks.push(findColor(color, colors, i, 10)); 
     } 
     var group = []; 
     $.when.apply($, tasks).done(function() { 
      for(var j = 0; j < arguments.length; j++) 
      { 
       group = group.concat(arguments[j]); 
      } 
      console.log(group); 
     }); 
    } 

    function findColor(sample, colors, startIndex, segmentSize) 
    { 
     return $.Deferred(function (deferred) { 
      setTimeout(function(){ 
       var result = []; 
       var pattern = /#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})/i; 
       var sampleMatch = pattern.exec(sample); 
       if (sampleMatch) { 
        for (var i = startIndex; i < startIndex + segmentSize && i < colors.length; i++) { 
         var match = pattern.exec(colors[i]); 
         if (match) { 
          if (sampleMatch[1].toUpperCase() == match[1].toUpperCase() 
           || 
           sampleMatch[2].toUpperCase() == match[2].toUpperCase() 
           || 
           sampleMatch[3].toUpperCase() == match[3].toUpperCase()) { 
           result.push(colors[i]); 
          } 
         } 
        } 
       } 
       deferred.resolve(result); 
      }, 0); 
     }).promise(); 
    } 
</script> 
+0

क्या आप समझा सकते हैं कि इस सवाल के साथ क्या करना है? – Bergi

+0

असीमित कुछ भी नहीं होने पर आप स्थगित क्यों उपयोग कर रहे हैं? – Bergi

+0

@ बर्गि, आप सही हैं। मैंने रंग सेट के विभाजन पर एकाधिक असीमित परिचालनों के साथ एक डेमो दिखाने का लुत्फ उठाया लेकिन मैंने उन परिचालनों को एसिंक नहीं बनाया। धन्यवाद! –

0

आप पिछले प्रसंस्करण चलाने में जो सूचकांक प्राप्त कर चुके हैं उसे बस स्टोर कर सकते हैं। सब के बाद, आप सरणी कई बार दोहराने में नहीं करना चाहती , आप केवल एक बार लेकिन कई चरणों में पुनरावृति करना चाहते हैं।

function process(arr, step, start) { 
 
    var take = Math.min(arr.length - start, Math.round(1 + Math.random() * 3)); 
 
    for (var i = start; i < start + take; i++) { 
 
     console.log("processing item " + arr[i] + " in step " + step); 
 
    } 
 
    return take; 
 
} 
 

 
var arr = [1, 2, 3, 4, 5] 
 
for (var step = 0, i = 0; i < arr.length; step++) 
 
    i += process(arr, step, i);

+0

दुर्भाग्य से यह काम नहीं करेगा क्योंकि मैं अनुक्रमिक क्रम में आवश्यक प्रसंस्करण नहीं कर रहा हूं। मुझे लगता है कि मैंने अपने जवाब में यह स्पष्ट नहीं किया। मैं पहली बार शुरुआत से एक आइटम और अंत में एक आइटम को संसाधित कर सकता हूं - उन्हें एक दूसरे के बगल में नहीं होना चाहिए। – abagshaw

+0

हां, आपको वास्तव में अपने प्रश्न पर काम करने की ज़रूरत है और हमें दिखाएं कि आप वर्तमान में क्या कर रहे हैं और आपको क्या चाहिए (उदाहरण के लिए प्रसंस्करण के लिए आदेश निर्धारित करता है)। अगर यह केवल शुरुआत या अंत से ही ले रहा है, तो आप दो सूचकांक का उपयोग कर सकते हैं, लेकिन यह किसी और चीज की तरह लगता है। – Bergi

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