পুনরাবৃত্তি স্ট্রিং - জাভাস্ক্রিপ্ট


271

একটি স্বেচ্ছাসেবী পরিমাণে পুনরাবৃত্তি করা স্ট্রিং ফেরতের জন্য সেরা বা সবচেয়ে সংক্ষিপ্ত পদ্ধতি কী?

নিম্নলিখিতটি এখন পর্যন্ত আমার সেরা শট:

function repeat(s, n){
    var a = [];
    while(a.length < n){
        a.push(s);
    }
    return a.join('');
}

5
10 বছর আগে আমার এই সমস্যার সমাধানের একটি সুপরিচিত সমাধান ছিল এবং যা আপনি জাভাস্ক্রিপ্ট অপ্টিমাইজেশান নিবন্ধে উদাহরণ হিসাবে ব্যবহার করেছেন আপনি এই প্রশ্নটি জিজ্ঞাসা করার কয়েক মাস আগে: ওয়েবরেফারেন্স / প্রোগ্রামিং / জাভাস্ক্রিপ্ট / জেকএম 3/3 .html স্পষ্টতই, বেশিরভাগ লোকেরা সেই কোডটি ভুলে গিয়েছিল এবং আমি আমার থেকে নীচের থেকে ভাল কোনও সমাধান দেখতে পাচ্ছি না। সেরা অ্যালগরিদম দেখে মনে হচ্ছে এটি আমার কোড থেকে তুলে নেওয়া হয়েছে; আমার কোডটি কীভাবে কাজ করে তার একটি ভুল বোঝাবুঝির কারণে এটি ক্ষতিকারক কনটেন্টেশনটির একটি অতিরিক্ত পদক্ষেপ করে যা একটি বিশেষ লুপের সাহায্যে আমার মূলতে মুছে ফেলা হয়।
জোসেফ মায়ার্স

10
কেউই জোসেফের সমাধানটি তুলেনি। অ্যালগরিদমের বয়স 3700 বছর। অতিরিক্ত পদক্ষেপের ব্যয়টি নগন্য। এবং এই নিবন্ধটিতে জাভাস্ক্রিপ্টে স্ট্রিং কনটেন্টেশন সম্পর্কিত ত্রুটি এবং ভুল ধারণা রয়েছে। জাভাস্ক্রিপ্ট কীভাবে সত্যিকার অর্থে অভ্যন্তরীণভাবে স্ট্রিংগুলি পরিচালনা করে সে সম্পর্কে আগ্রহী ব্যক্তির জন্য, দড়ি দেখুন
শিল্পীেক্স

4
নুনের মনে হয়েছে যে স্ট্রিং প্রোটাইপ পুনরাবৃত্তি কমপক্ষে ফায়ার ফক্সে সংজ্ঞায়িত এবং প্রয়োগ করা হয়েছে।
কেনেবেক

3
@ একনেবেক: হ্যাঁ, এটি একটি ইকোস্প্রিপ্ট feature বৈশিষ্ট্য যা এই প্রশ্নটি জিজ্ঞাসা করার সময় ছিল না। এটি এখন মোটামুটি সু-সমর্থিত।
rvighne

3
@rvighne - আমি এইমাত্র চেক করা kangax.github.io/compat-table/es6/#String.prototype.repeat আমি Firefox থেকে একচেটিয়াভাবে সমর্থন এবং হিসাবে "মোটামুটি ভাল সমর্থিত" Chrome বিবেচনা করবে না
aaaaaa

উত্তর:


405

নতুন পাঠকদের জন্য নোট: এই উত্তরটি পুরানো এবং মারাত্মকভাবে ব্যবহারিক নয় - এটি কেবল "চালাক" কারণ এটি স্ট্রিংয়ের কাজ শেষ করতে অ্যারে স্টাফ ব্যবহার করে। যখন আমি "কম প্রক্রিয়া" লিখেছিলাম তখন আমি অবশ্যই "কম কোড" বোঝাতাম কারণ পরবর্তী উত্তরগুলিতে অন্যরা যেমন উল্লেখ করেছে, এটি শূকের মতো কাজ করে। সুতরাং গতি আপনার পক্ষে গুরুত্বপূর্ণ হলে এটি ব্যবহার করবেন না।

আমি স্ট্রিং অবজেক্টে সরাসরি এই ফাংশনটি রাখি। একটি অ্যারে তৈরির পরিবর্তে, এটি পূরণ করা এবং খালি চরের সাথে এতে যোগদানের পরিবর্তে সঠিক দৈর্ঘ্যের একটি অ্যারে তৈরি করুন এবং এটি আপনার পছন্দসই স্ট্রিংয়ের সাথে যুক্ত করুন। একই ফলাফল, কম প্রক্রিয়া!

String.prototype.repeat = function( num )
{
    return new Array( num + 1 ).join( this );
}

alert( "string to repeat\n".repeat( 4 ) );

36
আমি দেশীয় অবজেক্টগুলি প্রসারিত না করার চেষ্টা করি তবে অন্যথায় এটি একটি সুন্দর সমাধান। ধন্যবাদ!
ব্র্যাড

34
@ ব্র্যাড - কেন নয়? আপনি বরং বিশ্বব্যাপী নেমস্পেসকে এমন কোনও ফাংশন দিয়ে দূষিত করতে চান যা মোটামুটি সুসজ্জিত হোম (স্ট্রিং অবজেক্ট) রয়েছে?
পিটার বেইলি

16
আসলে, আপনার উভয় যুক্তি গ্লোবাল নেমস্পেসেও প্রযোজ্য। যদি আমি একটি নেমস্পেস প্রসারিত করতে এবং সম্ভাব্য সংঘর্ষগুলি করতে যাচ্ছি, তবে আমি বরং এটি করব 1) বিশ্বব্যাপী নয়) প্রাসঙ্গিক এবং 3) রিফ্যাক্টর সহজ। এর অর্থ এটি স্ট্রিং প্রোটোটাইপটিতে রাখা, বিশ্বব্যাপী নয়।
পিটার বেইলি

11
আমি এই ফাংশনটিতে একটি পরিবর্তন করব "পার্সেন্ট" (") এর কাছাকাছি রাখা, যেহেতু যদি আপনার একটি সংখ্যার স্ট্রিং থাকে তবে আপনি জেএসের ধরণের জাগলের কারণে অদ্ভুত আচরণ পেতে পারেন। উদাহরণস্বরূপ: "আমার স্ট্রিং"। রিপিট ("6") == "61"
নিকফ

19
আপনি নেটিভ বস্তু প্রসারিত করতে না চান তাহলে, আপনি ফাংশন স্ট্রিং বস্তুর উপর পরিবর্তে এই মত করা হতে পারে: String.repeat = function(string, num){ return new Array(parseInt(num) + 1).join(string); };। এটির মতো এটিকে কল করুন:String.repeat('/\', 20)
Znarkus

203

আমি প্রস্তাবিত সমস্ত পদ্ধতির কর্মক্ষমতা পরীক্ষা করেছি।

এখানে আমার কাছে সবচেয়ে দ্রুততম রূপটি রয়েছে

String.prototype.repeat = function(count) {
    if (count < 1) return '';
    var result = '', pattern = this.valueOf();
    while (count > 1) {
        if (count & 1) result += pattern;
        count >>= 1, pattern += pattern;
    }
    return result + pattern;
};

বা একা একা ফাংশন হিসাবে:

function repeat(pattern, count) {
    if (count < 1) return '';
    var result = '';
    while (count > 1) {
        if (count & 1) result += pattern;
        count >>= 1, pattern += pattern;
    }
    return result + pattern;
}

এটি আর্টিস্টোেক্স অ্যালগরিদমের উপর ভিত্তি করে । এটা সত্যিই দ্রুত। এবং বৃহত্তর count, এটি দ্রুত theতিহ্যগত new Array(count + 1).join(string)পদ্ধতির সাথে তুলনা করে যায় ।

আমি কেবল 2 টি জিনিস পরিবর্তন করেছি:

  1. এর সাথে প্রতিস্থাপিত pattern = thisহয়েছে pattern = this.valueOf()(একটি স্পষ্ট ধরণের রূপান্তর সাফ করে);
  2. সেই ক্ষেত্রে অপ্রয়োজনীয় ক্রিয়াগুলি বাদ দিতে প্রোটোটাইপসif (count < 1) থেকে ফাংশনের শীর্ষে চেক যুক্ত করা হয়েছে ।
  3. ডেনিস উত্তর থেকে প্রয়োগ অপ্টিমাইজেশন (দ্রুতগতিতে 5-7%)

UPD

যারা আগ্রহী তাদের জন্য এখানে কিছুটা পারফরম্যান্স-টেস্টিং খেলার মাঠ তৈরি করেছেন ।

পরিবর্তনশীল count~ 0 .. 100:

পারফরম্যান্স ডায়াগ্রাম

ধ্রুবক count= 1024:

পারফরম্যান্স ডায়াগ্রাম

এটি ব্যবহার করুন এবং আপনি যদি পারেন তবে এটি আরও দ্রুত করুন :)


4
চমৎকার কাজ! আমি মনে করি count < 1কেসটি সত্যই অপ্রয়োজনীয় অপ্টিমাইজেশন।
জয়ভি

দুর্দান্ত অ্যালগরিদম হে (লগ এন)। মান ওফ ()
vp_arth

2
চিত্রের লিঙ্কগুলি মারা গেছে।
বেনজামিন গ্রুয়েনবাউম

লিঙ্কগুলি ঠিক আছে। অস্থায়ীভাবে অপ্রাপ্যতা হতে পারে
25:54

জেএসফিডাল পরীক্ষাটি আর সঠিকভাবে কাজ করে না; মনে হচ্ছে এটি প্রথম ক্রিয়াকলাপটি বারবার চালিয়ে যাচ্ছে (এটি নিশ্চিত হওয়ার জন্য এটি আধ ঘন্টা চালিয়ে গেছে)
রেভানপ্রডিজালকাইট

47

এই সমস্যাটি জাভাস্ক্রিপ্টের জন্য একটি সুপরিচিত / "ক্লাসিক" অপ্টিমাইজেশন ইস্যু, যা জাভাস্ক্রিপ্টের স্ট্রিংগুলি "অপরিবর্তনীয়" এবং একটি স্ট্রিংয়ের জন্য একটি একক অক্ষরকেও যুক্ত করে তৈরি করার প্রয়োজন রয়েছে, মেমরির জন্য বরাদ্দ এবং অনুলিপি সহ , একটি সম্পূর্ণ নতুন স্ট্রিং।

দুর্ভাগ্যক্রমে, এই পৃষ্ঠায় স্বীকৃত উত্তরটি ভুল, যেখানে "ভুল" এর অর্থ সহজ এক-চরিত্রের স্ট্রিংয়ের জন্য 3x এর পারফরম্যান্স ফ্যাক্টর এবং ছোট্ট স্ট্রিংগুলির জন্য 8x-97x দ্বারা আরও বারবার পুনরাবৃত্তি করা, বাক্য পুনরাবৃত্তি করার জন্য 300x, এবং অসীম ভুল যখন অ্যালগরিদমের জটিলতার অনুপাতের nসীমাটিকে অনন্তের দিকে নিয়ে যাওয়া। এছাড়াও, এই পৃষ্ঠায় আরও একটি উত্তর রয়েছে যা প্রায় সঠিক (গত 13 বছরে ইন্টারনেটে প্রচলিত সঠিক সমাধানের বহু প্রজন্মের একটির এবং তারতম্যের ভিত্তিতে)। যাইহোক, এই "প্রায় সঠিক" সমাধানটি 50% কার্যক্ষমতা হ্রাসের কারণ হিসাবে সঠিক অ্যালগরিদমের মূল পয়েন্টটি মিস করে।

গৃহীত উত্তরের জন্য জেএস পারফরম্যান্স ফলাফল, শীর্ষস্থানীয় অন্য উত্তর (এই উত্তরের মূল অ্যালগরিদমের একটি অবনমিত সংস্করণের উপর ভিত্তি করে), এবং এই উত্তরটি 13 বছর আগে তৈরি আমার অ্যালগরিদম ব্যবহার করে

~ অক্টোবর 2000 আমি এই সঠিক সমস্যার জন্য একটি অ্যালগরিদম প্রকাশ করি যা ব্যাপকভাবে অভিযোজিত, সংশোধিত, পরে অবশেষে খারাপভাবে বোঝা যায় এবং ভুলে যায়। এই সমস্যার প্রতিকারের জন্য, ২০০৮ সালের আগস্টে আমি একটি নিবন্ধ প্রকাশ করেছি http://www.webreferences.com/programming/javascript/jkm3/3.html অ্যালগোরিদম ব্যাখ্যা করে এবং সাধারণ-উদ্দেশ্যমূলক জাভাস্ক্রিপ্ট অপ্টিমাইজেশনের সাধারণ উদাহরণ হিসাবে এটি ব্যবহার করে। এতক্ষণে , ওয়েব তথ্যসূত্রটি আমার যোগাযোগের তথ্য এবং এই নিবন্ধ থেকে আমার নামও স্ক্র্যাব করেছে। এবং আবারও, অ্যালগরিদমটি ব্যাপকভাবে অভিযোজিত, সংশোধিত, তারপরে দুর্বলভাবে বোঝা যায় এবং মূলত ভুলে যায়।

আসল স্ট্রিং পুনরাবৃত্তি / জোসেফ মায়ারস দ্বারা জাভাস্ক্রিপ্ট অ্যালগরিদম, পাঠ্য .js এর মধ্যে পাঠ্য গুণিত ফাংশন হিসাবে Y2K; ওয়েব রেফারেন্স দ্বারা এই ফর্মটিতে আগস্ট, ২০০ published প্রকাশিত: http://www.webreferences.com/programming/javascript/jkm3/3.html (নিবন্ধটি জাভাস্ক্রিপ্ট অপ্টিমাইজেশনের উদাহরণ হিসাবে ফাংশনটি ব্যবহার করেছে, যা কেবলমাত্র অদ্ভুতের জন্য নাম "স্ট্রিংফিল 3।")

/*
 * Usage: stringFill3("abc", 2) == "abcabc"
 */

function stringFill3(x, n) {
    var s = '';
    for (;;) {
        if (n & 1) s += x;
        n >>= 1;
        if (n) x += x;
        else break;
    }
    return s;
}

এই নিবন্ধটি প্রকাশের দুই মাসের মধ্যেই, একই প্রশ্নটি স্ট্যাক ওভারফ্লোতে পোস্ট করা হয়েছিল এবং এখন অবধি আমার রাডারের নিচে উড়ে গেছে, যখন সম্ভবত এই সমস্যার মূল অ্যালগরিদম আবার ভুলে গিয়েছিল। এই স্ট্যাক ওভারফ্লো পৃষ্ঠায় সেরা সমাধানটি আমার সমাধানটির একটি পরিবর্তিত সংস্করণ, সম্ভবত বেশ কয়েকটি প্রজন্মের দ্বারা পৃথক। দুর্ভাগ্যক্রমে, পরিবর্তনগুলি সমাধানের অনুকূলতাকে নষ্ট করে দেয়। প্রকৃতপক্ষে, আমার মূল থেকে লুপটির কাঠামোটি পরিবর্তন করে, পরিবর্তিত সমাধানটি এক্সফেনশিয়াল ডুপ্লিকেটিংয়ের সম্পূর্ণ অপ্রয়োজনীয় অতিরিক্ত ধাপ সম্পাদন করে (এইভাবে সঠিক উত্তরে ব্যবহৃত একটি বৃহত স্ট্রিংটিতে একটি অতিরিক্ত সময় নিজেই যোগ করে এবং পরে তা বাতিল করে দেয়)।

নীচে এই সমস্যার উত্তর এবং সকলের উপকারের সাথে সম্পর্কিত কিছু জাভাস্ক্রিপ্ট অপ্টিমাইজেশনের আলোচনা সুনিশ্চিত করে।

কৌশল: বস্তু বা বস্তুর বৈশিষ্ট্যের উল্লেখ এড়িয়ে চলুন

এই কৌশলটি কীভাবে কাজ করে তা চিত্রিত করার জন্য, আমরা একটি বাস্তব-জীবন জাভাস্ক্রিপ্ট ফাংশন ব্যবহার করি যা দৈর্ঘ্যের জন্য স্ট্রিং তৈরি করে। এবং আমরা যেমন দেখব, আরও অনুকূলিতকরণ যুক্ত করা যেতে পারে!

এখানে ব্যবহৃত মতো একটি ফাংশন হ'ল পাঠ্যের কলামগুলি সারিবদ্ধ করতে প্যাডিং তৈরি করা, অর্থের বিন্যাসকরণের জন্য, বা সীমানা পর্যন্ত ব্লক ডেটা পূরণ করা। একটি পাঠ্য প্রজন্মের ফাংশন পাঠ্যের উপর পরিচালিত অন্য কোনও ফাংশন পরীক্ষার জন্য পরিবর্তনশীল দৈর্ঘ্যের ইনপুটকেও মঞ্জুরি দেয়। এই ফাংশনটি জাভাস্ক্রিপ্টের পাঠ্য প্রক্রিয়াকরণ মডিউলটির একটি গুরুত্বপূর্ণ উপাদান।

আমরা যখন এগিয়ে যাই, আমরা স্ট্রিংগুলি তৈরির জন্য একটি অনুকূলিত অ্যালগরিদমে আসল কোডটি বিকাশ করার সময় আরও দুটি গুরুত্বপূর্ণ অপটিমাইজেশন কৌশলগুলি কভার করব। চূড়ান্ত ফলাফলটি একটি শিল্প-শক্তি, উচ্চ-কার্যকারিতা ফাংশন যা আমি সর্বত্র ব্যবহার করেছি - জাভাস্ক্রিপ্ট অর্ডার ফর্মগুলিতে আইটেমের দাম এবং মোট সারিবদ্ধকরণ, ডেটা ফর্ম্যাটিং এবং ইমেল / পাঠ্য বার্তা বিন্যাসকরণ এবং অন্যান্য অনেকগুলি ব্যবহার।

স্ট্রিং তৈরির জন্য মূল কোড stringFill1()

function stringFill1(x, n) { 
    var s = ''; 
    while (s.length < n) s += x; 
    return s; 
} 
/* Example of output: stringFill1('x', 3) == 'xxx' */ 

বাক্য গঠন এখানে পরিষ্কার। আপনি দেখতে পাচ্ছেন যে, আরও অনুকূলিতকরণের আগে আমরা স্থানীয় ফাংশন ভেরিয়েবলগুলি ইতিমধ্যে ব্যবহার করেছি।

সচেতন হন যে কোডটিতে কোনও অবজেক্ট প্রোপার্টি সম্পর্কিত একটি নির্দোষ উল্লেখ রয়েছে s.lengthযা এর কার্য সম্পাদনকে আঘাত করে। আরও খারাপ, এই অবজেক্ট প্রোপার্টিটির ব্যবহার জাভাস্ক্রিপ্ট স্ট্রিং অবজেক্টের বৈশিষ্ট্য সম্পর্কে পাঠককে জানে এমন ধারণা তৈরি করে প্রোগ্রামটির সরলতা হ্রাস করে।

এই বস্তুর সম্পত্তি ব্যবহারের ফলে কম্পিউটার প্রোগ্রামের সাধারণতা নষ্ট হয়। প্রোগ্রামটি ধরে নিয়েছে যে xঅবশ্যই দৈর্ঘ্যের একটি স্ট্রিং হওয়া উচিত। এটি stringFill1()একক অক্ষরের পুনরাবৃত্তি ব্যতীত ফাংশনটির প্রয়োগকে সীমাবদ্ধ করে তোলে। এমনকি একক অক্ষর ব্যবহার করা যায় না যদি সেগুলিতে এইচটিএমএল সত্তার মতো একাধিক বাইট থাকে &nbsp;

কোনও অবজেক্ট প্রোপার্টিটির এই অপ্রয়োজনীয় ব্যবহারের ফলে সবচেয়ে খারাপ সমস্যাটি হ'ল খালি ইনপুট স্ট্রিংয়ে পরীক্ষা করা হলে ফাংশনটি একটি অসীম লুপ তৈরি করে x। সাধারণতা পরীক্ষা করতে, সামান্যতম ইনপুটটির পরিমাণে একটি প্রোগ্রাম প্রয়োগ করুন। একটি প্রোগ্রাম যা উপলব্ধ মেমরির পরিমাণ ছাড়িয়ে যাওয়ার জন্য ক্র্যাশ হওয়ার একটি অজুহাত রয়েছে। এই জাতীয় প্রোগ্রাম যা ক্র্যাশ হয় যখন কিছুই উত্পাদন করতে বলা হয় তা অগ্রহণযোগ্য। কখনও কখনও সুন্দর কোড হল বিষাক্ত কোড।

সরলতা কম্পিউটার প্রোগ্রামিংয়ের একটি অস্পষ্ট লক্ষ্য হতে পারে, তবে সাধারণত তা হয় না। যখন কোনও প্রোগ্রামে সাধারণের কোনও যুক্তিসঙ্গত স্তরের অভাব হয়, তখন এটি বলা ঠিক হবে না, "প্রোগ্রাম যতদূর এগিয়ে যায় তেমন ভাল"। আপনি দেখতে পাচ্ছেন, string.lengthসম্পত্তিটি ব্যবহার করে এই প্রোগ্রামটিকে সাধারণ সেটিংসে কাজ করা থেকে বাধা দেয় এবং প্রকৃতপক্ষে, ভুল প্রোগ্রামটি ব্রাউজার বা সিস্টেম ক্রাশের জন্য প্রস্তুত।

এই দুটি গুরুতর সমস্যার যত্ন নেওয়ার পাশাপাশি এই জাভাস্ক্রিপ্টের কার্যকারিতা উন্নত করার কোনও উপায় আছে কি?

অবশ্যই. শুধু পূর্ণসংখ্যা ব্যবহার করুন।

স্ট্রিং তৈরির জন্য অনুকূলিত কোড stringFill2()

function stringFill2(x, n) { 
    var s = ''; 
    while (n-- > 0) s += x; 
    return s; 
} 

টাইমিং কোড তুলনা করতে stringFill1()এবংstringFill2()

function testFill(functionToBeTested, outputSize) { 
    var i = 0, t0 = new Date(); 
    do { 
        functionToBeTested('x', outputSize); 
        t = new Date() - t0; 
        i++; 
    } while (t < 2000); 
    return t/i/1000; 
} 
seconds1 = testFill(stringFill1, 100); 
seconds2 = testFill(stringFill2, 100); 

সাফল্য এখন পর্যন্ত stringFill2()

stringFill1()100 বাইট স্ট্রিং পূরণ করতে 47.297 মাইক্রোসেকেন্ড (এক সেকেন্ডের মিলিয়নতম) stringFill2()লাগে এবং একই জিনিসটি করতে 27.68 মাইক্রোসেকেন্ড নেয়। এটি কোনও বস্তুর সম্পত্তির রেফারেন্স এড়িয়ে কার্য সম্পাদনে প্রায় দ্বিগুণ।

কৌশল: দীর্ঘ স্ট্রিংগুলিতে সংক্ষিপ্ত স্ট্রিং যুক্ত করা এড়িয়ে চলুন

আমাদের আগের ফলাফলটি দেখতে ভাল লাগছিল - খুব ভাল, আসলে। stringFill2()আমাদের প্রথম দুটি অপটিমাইজেশন ব্যবহারের কারণে উন্নত ফাংশনটি আরও দ্রুত। আপনি কি বিশ্বাস করবেন যদি আমি আপনাকে বলি যে এটি এখনকার তুলনায় অনেক গুণ দ্রুত উন্নতি করা যায়?

হ্যাঁ, আমরা সেই লক্ষ্যটি অর্জন করতে পারি। এখনই আমাদের কীভাবে সংক্ষিপ্ত স্ট্রিংগুলিকে দীর্ঘ স্ট্রিংগুলিতে সংযোজন করা উচিত তা বোঝানোর দরকার explain

স্বল্প-মেয়াদী আচরণটি আমাদের আসল কার্যের তুলনায় বেশ ভাল বলে মনে হচ্ছে। কম্পিউটার বিজ্ঞানীরা কোনও ফাংশন বা কম্পিউটার প্রোগ্রাম অ্যালগরিদমের "অ্যাসিপটোটিক আচরণ" বিশ্লেষণ করতে পছন্দ করেন, যার অর্থ বৃহত ইনপুটগুলির সাথে এটি পরীক্ষা করে দীর্ঘমেয়াদী আচরণটি অধ্যয়ন করা। কখনও কখনও আরও পরীক্ষা না করে, কেউ কখনই কম্পিউটার প্রোগ্রামের উন্নতি করতে পারে সে সম্পর্কে সচেতন হয় না। কী হবে তা দেখতে, আমরা একটি 200-বাইট স্ট্রিং তৈরি করতে যাচ্ছি।

যে সমস্যাটি দেখা যাচ্ছে stringFill2()

আমাদের টাইমিং ফাংশনটি ব্যবহার করে আমরা দেখতে পেলাম যে 200 বাইট স্ট্রিংয়ের জন্য সময়টি 100 বাইট স্ট্রিংয়ের 27.68 এর তুলনায়, 62.54 মাইক্রোসেকেন্ডে বেড়ে যায়। মনে হচ্ছে দ্বিগুণ কাজ করার জন্য সময়টি দ্বিগুণ করা উচিত, তবে পরিবর্তে এটি তিনগুণ বা চারগুণ হয়েছে। প্রোগ্রামিংয়ের অভিজ্ঞতা থেকে, এই ফলাফলটি অদ্ভুত বলে মনে হচ্ছে, কারণ যদি কিছু হয় তবে কাজটি আরও দক্ষতার সাথে করা হওয়ায় ফাংশনটি কিছুটা দ্রুত হওয়া উচিত (ফাংশন কলের জন্য 200 বাইট প্রতি ফাংশন কলের পরিবর্তে 100 বাইটের চেয়ে 100 জন) call এই ইস্যুটির জাভাস্ক্রিপ্ট স্ট্রিংগুলির একটি কুখ্যাত সম্পত্তি রয়েছে: জাভাস্ক্রিপ্ট স্ট্রিংগুলি "অপরিবর্তনীয়"।

অপরিহার্য অর্থ হ'ল একবার স্ট্রিং তৈরি হয়ে গেলে আপনি পরিবর্তন করতে পারবেন না। একবারে একটি বাইট যুক্ত করে, আমরা আরও একটি প্রচেষ্টা বাইট ব্যবহার করছি না। আমরা আসলে পুরো স্ট্রিং প্লাস আরও একটি বাইট পুনরুদ্ধার করছি।

কার্যত, 100 বাইট স্ট্রিংয়ে আরও একটি বাইট যুক্ত করতে, এটি 101 বাইটের কাজের মূল্য নেয়। আসুন সংক্ষেপে Nবাইটগুলির একটি স্ট্রিং তৈরি করার জন্য গণনা ব্যয় বিশ্লেষণ করা যাক । প্রথম বাইট যুক্ত করার ব্যয় গণ্য প্রচেষ্টার 1 ইউনিট। দ্বিতীয় বাইট যুক্ত করার ব্যয় এক ইউনিট নয় 2 ইউনিট (প্রথম বাইটটি একটি নতুন স্ট্রিং অবজেক্টে অনুলিপি করার পাশাপাশি দ্বিতীয় বাইট যুক্ত করার)। তৃতীয় বাইটের জন্য 3 ইউনিট ইত্যাদির জন্য প্রয়োজন cost

C(N) = 1 + 2 + 3 + ... + N = N(N+1)/2 = O(N^2)। প্রতীকটি O(N^2)এন স্কোয়ারের বিগ হে হিসাবে উচ্চারণ করা হয় এবং এর অর্থ দীর্ঘমেয়াদে গণনা ব্যয় স্ট্রিং দৈর্ঘ্যের বর্গক্ষেত্রের সমানুপাতিক। 100 টি অক্ষর তৈরি করতে 10,000 ইউনিট কাজ লাগে এবং 200 টি অক্ষর তৈরি করতে 40,000 ইউনিট কাজ লাগে।

এজন্য 100 টি চরিত্রের চেয়ে 200 টি অক্ষর তৈরি করতে দ্বিগুণের বেশি সময় লেগেছিল। আসলে, এটি দীর্ঘ হিসাবে চার বার নেওয়া উচিত ছিল। আমাদের প্রোগ্রামিংয়ের অভিজ্ঞতাটি সঠিক ছিল যে দীর্ঘতর স্ট্রিংয়ের জন্য কাজটি কিছুটা দক্ষতার সাথে করা হচ্ছে, এবং তাই এটি প্রায় তিনবার বেশি সময় নিয়েছে। ফাংশন কলের ওভারহেড একবার স্ট্রিংয়ের কতক্ষণ তৈরি করা যায় তা তুচ্ছ হয়ে উঠলে, তার চেয়ে দ্বিগুণ দীর্ঘ স্ট্রিং তৈরি করতে চার গুণ বেশি সময় লাগবে।

( html = 'abcd\n' + 'efgh\n' + ... + 'xyz.\n'Noteতিহাসিক দ্রষ্টব্য: এই বিশ্লেষণটি উত্স কোডের স্ট্রিংগুলিতে অগত্যা প্রযোজ্য না, যেমন জাভাস্ক্রিপ্ট উত্স কোড সংকলক জাভাস্ক্রিপ্ট স্ট্রিং অবজেক্টে পরিণত করার আগে স্ট্রিংগুলিতে যোগ দিতে পারে। মাত্র কয়েক বছর আগে, কেজেএস বাস্তবায়ন জাভাস্ক্রিপ্ট হ'ল বা ক্রস হয়ে যাবে যখন উত্স কোডের দীর্ঘ স্ট্রিংগুলি প্লাস চিহ্নগুলির সাথে যুক্ত হয়েছিল। গণনার সময় যেহেতু O(N^2)ওয়েব পৃষ্ঠাগুলি তৈরি করা কঠিন ছিল না যা কনকরার ওয়েব ব্রাউজার বা সাফারি, যা কেজেএস জাভাস্ক্রিপ্ট ইঞ্জিন কোর ব্যবহার করেছিল over আমি যখন একটি মার্কআপ ভাষা এবং জাভাস্ক্রিপ্ট মার্কআপ ল্যাঙ্গুয়েজ পার্সার বিকাশ করছিলাম তখন এই সমস্যাটি জুড়ে এসেছিল এবং তারপরে আমি যখন জাভাস্ক্রিপ্ট অন্তর্ভুক্তের জন্য আমার স্ক্রিপ্ট লিখেছিলাম তখন সমস্যাটি কি ঘটছে তা আবিষ্কার করেছি))

স্পষ্টত পারফরম্যান্সের এই দ্রুত অবক্ষয় একটি বিশাল সমস্যা। আমরা জাভাস্ক্রিপ্টের অপরিবর্তনীয় বস্তু হিসাবে স্ট্রিংগুলি পরিচালনা করার পদ্ধতি পরিবর্তন করতে পারি না তা দিয়ে এটি কীভাবে মোকাবেলা করতে পারি? সমাধানটি হল একটি অ্যালগরিদম ব্যবহার করা যা স্ট্রিংটিকে যতবার সম্ভব পুনরায় তৈরি করে।

স্পষ্ট করার জন্য, আমাদের লক্ষ্যটি দীর্ঘ স্ট্রিংগুলিতে সংক্ষিপ্ত স্ট্রিং যুক্ত করা এড়ানো, যেহেতু সংক্ষিপ্ত স্ট্রিং যুক্ত করতে, পুরো দীর্ঘ স্ট্রিংটিকেও নকল করতে হবে।

দীর্ঘ স্ট্রিংগুলিতে সংক্ষিপ্ত স্ট্রিংগুলি এড়ানোর জন্য কীভাবে অ্যালগরিদম কাজ করে

নতুন স্ট্রিং অবজেক্টগুলি তৈরি হওয়ার সংখ্যা হ্রাস করার জন্য এখানে একটি ভাল উপায়। দীর্ঘতর দৈর্ঘ্যের স্ট্রিং একসাথে সংঘবদ্ধ করুন যাতে একবারে একাধিক বাইট আউটপুটে যুক্ত হয়।

উদাহরণস্বরূপ, দৈর্ঘ্যের একটি স্ট্রিং তৈরি করতে N = 9:

x = 'x'; 
s = ''; 
s += x; /* Now s = 'x' */ 
x += x; /* Now x = 'xx' */ 
x += x; /* Now x = 'xxxx' */ 
x += x; /* Now x = 'xxxxxxxx' */ 
s += x; /* Now s = 'xxxxxxxxx' as desired */

এটি করার জন্য 1 দৈর্ঘ্যের একটি স্ট্রিং তৈরি করা, দৈর্ঘ্যের 2 টি স্ট্রিং তৈরি করা, 4 দৈর্ঘ্যের একটি স্ট্রিং তৈরি করা, 8 দৈর্ঘ্যের একটি স্ট্রিং তৈরি করা এবং অবশেষে, 9 দৈর্ঘ্যের একটি স্ট্রিং তৈরি করা দরকার? আমরা কত খরচ সঞ্চয় করেছি?

পুরানো খরচ C(9) = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 9 = 45

নতুন খরচ C(9) = 1 + 2 + 4 + 8 + 9 = 24

নোট করুন যে আমাদের দৈর্ঘ্যের 0 টি দৈর্ঘ্যের একটি স্ট্রিংয়ের সাথে 1 দৈর্ঘ্যের একটি স্ট্রিং যোগ করতে হবে, তারপরে 1 দৈর্ঘ্যের একটি স্ট্রিং 1 দৈর্ঘ্যের একটি স্ট্রিং, তারপরে দৈর্ঘ্যের একটি স্ট্রিং 2 দৈর্ঘ্যের একটি স্ট্রিং, তারপরে 4 দৈর্ঘ্যের একটি স্ট্রিং যোগ করতে হয়েছিল দৈর্ঘ্যের একটি স্ট্রিং, তারপরে দৈর্ঘ্যের একটি স্ট্রিং দৈর্ঘ্যের একটি স্ট্রিং প্রাপ্ত করার জন্য 9 দৈর্ঘ্যের একটি স্ট্রিং 9 দৈর্ঘ্যের একটি স্ট্রিং প্রাপ্ত করার জন্য সংক্ষিপ্ত আকারে বলা যেতে পারে যে আমরা দীর্ঘ স্ট্রিংগুলিতে সংক্ষিপ্ত স্ট্রিং যুক্ত করা এড়ানো বা অন্যটিতে শব্দগুলি, সমান বা প্রায় সমান দৈর্ঘ্যের স্ট্রিংগুলি একসাথে আঁকতে চেষ্টা করে।

পুরানো গণনার জন্য আমরা একটি সূত্র পেয়েছি N(N+1)/2। নতুন ব্যয়ের জন্য কি কোনও সূত্র আছে? হ্যাঁ, তবে এটি জটিল। গুরুত্বপূর্ণ বিষয়টি এটি হ'ল O(N), এবং স্ট্রিংয়ের দৈর্ঘ্য দ্বিগুণ করা প্রায় চারগুণ না হয়ে কাজের পরিমাণ দ্বিগুণ করবে।

এই নতুন ধারণাটি কার্যকর করে এমন কোডটি গণনা ব্যয়ের সূত্রের মতো প্রায় জটিল। আপনি যখন এটি পড়েন, মনে রাখবেন যে >>= 11 বাইট দ্বারা ডান স্থানান্তরিত করার অর্থ। সুতরাং যদি n = 10011একটি বাইনারি সংখ্যা হয়, তবে n >>= 1মানটি ফলাফল করে n = 1001

আপনি যে কোডটি চিনতে পারবেন না তার অন্য অংশটি হ'ল বিটওয়াইজ এবং অপারেটর, লিখিত &n & 1সর্বশেষ বাইনারি অঙ্ক 1 হলে এক্সপ্রেশনটি সত্য n, এবং শেষ বাইনারি nসংখ্যা 0 হলে মিথ্যা হয়।

নতুন অত্যন্ত দক্ষ stringFill3()ফাংশন

function stringFill3(x, n) { 
    var s = ''; 
    for (;;) { 
        if (n & 1) s += x; 
        n >>= 1; 
        if (n) x += x; 
        else break; 
    } 
    return s; 
} 

এটি প্রশিক্ষণহীন চোখে দেখতে কুৎসিত দেখাচ্ছে, তবে এটির অভিনয়টি সুন্দর থেকে কম কিছু নয়।

আসুন দেখুন ঠিক কীভাবে এই ফাংশনটি সম্পাদন করে। ফলাফলগুলি দেখার পরে, সম্ভবত আপনি কোনও O(N^2)অ্যালগরিদম এবং অ্যালগরিদমের মধ্যে পার্থক্যটি কখনও ভুলতে পারবেন না O(N)

stringFill1()200 বাইট স্ট্রিং তৈরি করতে 88.7 মাইক্রোসেকেন্ড (এক সেকেন্ডের মিলিয়নতম) লাগে stringFill2(), 62.54 stringFill3()লাগে এবং মাত্র 4.608 লাগে। কী এত ভাল এই অ্যালগরিদম তৈরি? সমস্ত ফাংশন স্থানীয় ফাংশন ভেরিয়েবলগুলি ব্যবহার করে সুবিধা গ্রহণ করেছিল, তবে দ্বিতীয় এবং তৃতীয় অপ্টিমাইজেশান কৌশলগুলির সুবিধা গ্রহণের কার্যকারিতার ক্ষেত্রে বিশ-গুণ উন্নতি যুক্ত করেছে stringFill3()

গভীর বিশ্লেষণ

এই বিশেষ ফাংশনটি কী কারণে প্রতিযোগিতাটি পানির বাইরে ফেলে দেয়?

আমি যেমন উল্লেখ করেছি, এই দুটি ফাংশন stringFill1()এবং stringFill2()এত ধীরে ধীরে চালিত হওয়ার কারণটি হচ্ছে জাভাস্ক্রিপ্টের স্ট্রিংগুলি পরিবর্তনযোগ্য নয়। জাভাস্ক্রিপ্ট দ্বারা সঞ্চিত স্ট্রিং ডেটাতে একবারে আরও একটি বাইট যুক্ত করতে মেমোরিটিকে পুনরায় স্থান দেওয়া যাবে না। প্রতিবার স্ট্রিংয়ের শেষে আরও একটি বাইট যুক্ত করা হলে পুরো স্ট্রিংটি শুরু থেকে শেষ পর্যন্ত পুনরায় জেনারেট হয়।

এইভাবে, স্ক্রিপ্টটির কার্যকারিতা উন্নত করতে, সময়ের আগে একসাথে দুটি স্ট্রিং সংযুক্ত করে দীর্ঘ দৈর্ঘ্যের স্ট্রিংগুলি আবশ্যক এবং তারপরে পুনরাবৃত্তভাবে কাঙ্ক্ষিত স্ট্রিংয়ের দৈর্ঘ্য তৈরি করতে হবে।

উদাহরণস্বরূপ, একটি 16-অক্ষরের বাইট স্ট্রিং তৈরি করতে, প্রথমে দুটি বাইট স্ট্রিং প্রাক্পম্পুট করা হবে। তারপরে দুটি বাইট স্ট্রিং একটি চার-বাইট স্ট্রিং প্রাক্পম্প্ট করতে পুনরায় ব্যবহৃত হবে। তারপরে আট-বাইট স্ট্রিংকে পূর্ববর্তী করতে ফোর-বাইট স্ট্রিংটি পুনরায় ব্যবহার করা হবে। অবশেষে, দুটি আট-বাইট স্ট্রিং পুনরায় ব্যবহৃত হবে 16 বাইটের পছন্দসই নতুন স্ট্রিং তৈরি করতে। সামগ্রিকভাবে চারটি নতুন স্ট্রিং তৈরি করতে হয়েছিল, দৈর্ঘ্যের একটি, দৈর্ঘ্যের একটি, 4 দৈর্ঘ্যের একটি, 8 দৈর্ঘ্যের একটি এবং দৈর্ঘ্যের একটি 16. মোট ব্যয় 2 + 4 + 8 + 16 = 30।

দীর্ঘ মেয়াদে এই দক্ষতাটি বিপরীত ক্রমে যুক্ত করে এবং প্রথম শর্ত a1 = N দিয়ে শুরু করে জ্যামিতিক সিরিজ ব্যবহার করে এবং আর = 1/2 এর একটি সাধারণ অনুপাত রেখে গণনা করা যেতে পারে। একটি জ্যামিতিক সিরিজের যোগফল দেওয়া হয়েছে a_1 / (1-r) = 2N

এটি দৈর্ঘ্যের একটি নতুন স্ট্রিং তৈরি করতে একটি অক্ষর যুক্ত করার চেয়ে আরও দক্ষ, 3, 4, 5 এবং আরও দীর্ঘ দৈর্ঘ্যের একটি নতুন স্ট্রিং তৈরি করে 16 অবধি The , এবং এটির মোট ব্যয় হবে n (n + 1) / 2 = 16 (17) / 2 = 8 (17) = 136

স্পষ্টতই, 136 30 এর চেয়ে অনেক বেশি সংখ্যক সংখ্যা এবং তাই পূর্ববর্তী অ্যালগরিদম স্ট্রিং তৈরি করতে অনেক বেশি সময় নেয়।

দুটি পদ্ধতির তুলনা করতে আপনি 123,457 দৈর্ঘ্যের একটি স্ট্রিংতে পুনরাবৃত্ত অ্যালগরিদমকে ("বিভাজন এবং বিজয়" নামেও পরিচিত) কত দ্রুত তা দেখতে পারেন। আমার ফ্রিবিএসডি কম্পিউটারে stringFill3()ফাংশনে প্রয়োগ করা এই অ্যালগরিদমটি 0.001058 সেকেন্ডের মধ্যে স্ট্রিং তৈরি করে, যখন মূল stringFill1()ফাংশনটি 0.0808 সেকেন্ডের মধ্যে স্ট্রিং তৈরি করে। নতুন ফাংশনটি 76 গুণ দ্রুত।

স্ট্রিংয়ের দৈর্ঘ্য বড় হওয়ার সাথে সাথে পারফরম্যান্সের পার্থক্য বৃদ্ধি পায়। বৃহত্তর এবং বৃহত্তর স্ট্রিং তৈরি হওয়ার সীমাতে, মূল ফাংশনটি প্রায় C1(ধ্রুবক) বারের N^2মতো আচরণ করে এবং নতুন ফাংশনটি C2(ধ্রুবক) বারের মতো আচরণ করে N

আমাদের পরীক্ষা থেকে আমরা মান নির্ধারণ করতে পারেন C1হতে C1 = 0.0808 / (123457)2 = .00000000000530126997, এবং মান C2হতে C2 = 0.001058 / 123457 = .00000000856978543136। 10 সেকেন্ডের মধ্যে, নতুন ফাংশনটি 1,166,890,359 টি অক্ষর যুক্ত স্ট্রিং তৈরি করতে পারে। এই একই স্ট্রিংটি তৈরি করতে, পুরানো ফাংশনের জন্য 7,218,384 সেকেন্ড সময় প্রয়োজন।

দশ সেকেন্ডের তুলনায় এটি প্রায় তিন মাস!

আমি কেবল উত্তর দিচ্ছি (বেশ কয়েক বছর দেরিতে) কারণ এই সমস্যার আমার মূল সমাধানটি 10 ​​বছরেরও বেশি সময় ধরে ইন্টারনেটের চারপাশে ভেসে আসছে, এবং সম্ভবত এটি অল্প কিছু লোকই বুঝতে পারে যা এটি মনে করে না। আমি ভেবেছিলাম যে এটি সম্পর্কে একটি নিবন্ধ লিখে এখানে আমি সাহায্য করব:

উচ্চ গতির জাভাস্ক্রিপ্ট / পৃষ্ঠা 3 এর জন্য পারফরম্যান্স অপটিমাইজেশন

দুর্ভাগ্যক্রমে, এখানে উপস্থাপন করা অন্যান্য সমাধানগুলির মধ্যে কিছু এখনও রয়েছে যেগুলি সঠিক পরিমাণে 10 সেকেন্ডে তৈরি করে এমন পরিমাণ আউটপুট তৈরি করতে তিন মাস সময় লাগে would

আমি স্ট্যাক ওভারফ্লো সম্পর্কে একটি ক্যানোনিকাল উত্তর হিসাবে নিবন্ধটির অংশটি পুনরুত্পাদন করতে সময় নিতে চাই।

মনে রাখবেন যে এখানে সেরা-সম্পাদনকারী অ্যালগরিদম স্পষ্টভাবে আমার অ্যালগরিদমের উপর ভিত্তি করে এবং সম্ভবত অন্য কারও তৃতীয় বা চতুর্থ প্রজন্মের অভিযোজন থেকে উত্তরাধিকার সূত্রে প্রাপ্ত হয়েছিল। দুর্ভাগ্যক্রমে, পরিবর্তনগুলির ফলে এর কার্যকারিতা হ্রাস পেয়েছে। এখানে উপস্থাপিত আমার সমাধানটির বৈকল্পিকতা সম্ভবত আমার বিভ্রান্তিকর ভাবটি বুঝতে পারে নি for (;;)যা দেখতে সিটিতে লিখিত কোনও সার্ভারের মূল অসীম লুপের মতো, এবং যা কেবল লুপ নিয়ন্ত্রণের জন্য সাবধানতার সাথে অবস্থানযুক্ত ব্রেক স্টেটমেন্টকে অনুমতি দেওয়ার জন্য ডিজাইন করা হয়েছিল, এটির সবচেয়ে সংক্ষিপ্ত উপায় to স্ট্রিংটির এক অতিরিক্ত অপ্রয়োজনীয় সময়টিকে দ্রুতভাবে এড়িয়ে চলুন।


4
এই উত্তরটি এমন অনেকগুলি উত্সাহ পাওয়া উচিত হয়নি। প্রথমত, জোসেফের মালিকানা দাবিগুলি হাস্যকর। অন্তর্নিহিত অ্যালগরিদমের বয়স 3700 বছর।
আর্টিস্টেক্স

2
দ্বিতীয়ত, এতে প্রচুর ভুল তথ্য রয়েছে। আধুনিক জাভাস্ক্রিপ্ট প্রয়োগগুলি কনটেনটেশন করার সময় এমনকি স্ট্রিংয়ের বিষয়বস্তুগুলিকে স্পর্শ করে না (ভি 8 কনস্ট্রস্ট্রিং টাইপের একটি উপাদান হিসাবে সংযুক্ত স্ট্রিংগুলি উপস্থাপন করে)। বাকী সমস্ত বর্ধনযোগ্যতা নগদ (অ্যাসিপটোটিক জটিলতার ক্ষেত্রে)।
আর্টিস্টেক্স

3
স্ট্রিংগুলি কীভাবে সংযুক্ত করা হয় সে সম্পর্কে আপনার ধারণাটি ভুল। দুটি স্ট্রিং সংমিশ্রিত করতে, জাভাস্ক্রিপ্ট মোটামুটি উপাদান স্ট্রিংয়ের বাইটগুলি পড়ে না। পরিবর্তে, এটি কেবল একটি বস্তু তৈরি করে যা বাম এবং ডান অংশগুলিকে বোঝায়। এ কারণেই লুপের শেষ কনটেনটেশন প্রথমটির চেয়ে বেশি ব্যয়বহুল নয়।
আর্টিস্টেক্স

3
অবশ্যই, স্ট্রিংকে সূচকের জন্য ও (1) ব্যয়ের চেয়ে বড় এটির ফলস্বরূপ ফলস্বরূপ আরও সমালোচনা করা যেতে পারে যা প্রকৃতপক্ষে আরও মূল্যায়নের যোগ্য।
আর্টিস্টেক্স

1
এটি একটি দুর্দান্ত পড়া ছিল। আপনার দক্ষতা এবং সেগুলি সম্পর্কে একটি বই লেখা উচিত!

39

এই এক বেশ দক্ষ

String.prototype.repeat = function(times){
    var result="";
    var pattern=this;
    while (times > 0) {
        if (times&1)
            result+=pattern;
        times>>=1;
        pattern+=pattern;
    }
    return result;
};

11
@ ওলেগস, আমি মনে করি যে কোনও ব্যক্তির পক্ষে বা ব্যক্তির সৃজনশীলতার পক্ষে ভোট দেওয়ার চেয়ে ভোট দেওয়ার ধারণাটি কম (যা প্রকৃতই প্রশংসনীয়) তবে ধারণাটি সবচেয়ে সম্পূর্ণ সমাধানের পক্ষে ভোট দেওয়া, যাতে এটি সহজেই খুঁজে পাওয়া যায় নিখুঁতটির অনুসন্ধানে সমস্ত উত্তর পড়তে না পেরে তালিকার শীর্ষে। (কারণ, দুর্ভাগ্যক্রমে, আমাদের সকলেরই সীমিত সময় আছে ...)
সোরিন পোস্টেলনিকু

38

ভাল খবর! String.prototype.repeatহয় এখন জাভাস্ক্রিপ্ট একটি অংশ

"yo".repeat(2);
// returns: "yoyo"

পদ্ধতিটি ইন্টারনেট এক্সপ্লোরার এবং অ্যান্ড্রয়েড ওয়েবভিউ বাদে সমস্ত বড় ব্রাউজার দ্বারা সমর্থিত। একটি আপ টু ডেট তালিকার জন্য, MDN দেখুন: স্ট্রিং.প্রোটোটাইপ.রেপিয়েট> ব্রাউজারের সামঞ্জস্য

সমর্থন ব্যতীত ব্রাউজারগুলির জন্য এমডিএন এর একটি পলিফিল রয়েছে ।


বর্তমান পরিস্থিতি সম্পর্কে ধন্যবাদ প্রতিবেদন করার জন্য ধন্যবাদ, যদিও আমি মনে করি মোজিলা পলিফিল বেশিরভাগ প্রয়োজনের জন্য জটিল (আমি তাদের ধরে নিই যে তারা তাদের দক্ষ সি প্রয়োগের আচরণের নকল করার চেষ্টা করে) - সুতরাং প্রকৃতপক্ষে সংক্ষিপ্ততার জন্য ওপি-র প্রয়োজনীয়তার জবাব দেবে না। পলিফিল হিসাবে সেট করা অন্য যে কোনও পন্থা আরও সংক্ষিপ্ত হতে বাধ্য ;-)
গাস

2
স্পষ্টভাবে! তবে অন্তর্নির্মিত ব্যবহারটি অবশ্যই সংক্ষিপ্ত সংস্করণ হতে হবে। যেহেতু পলিফিলগুলি মূলত কেবল ব্যাক-পোর্ট হয় তাই চশমাগুলির সাথে সামঞ্জস্যতা নিশ্চিত করার জন্য এগুলি কিছুটা জটিল হয়ে ওঠে (বা প্রস্তাবিত চশমা, এক্ষেত্রে)। আমি এটি সম্পূর্ণতার জন্য যুক্ত করেছি, কোন পদ্ধতিটি ব্যবহার করতে হবে তা সিদ্ধান্ত নেওয়ার জন্য এটি ওপির উপর নির্ভর করে।
আন্দ্রে লাস্লোলো

19

স্ট্রিং.প্রোটোটাইপ.রেপিয়াট এখন ES6 স্ট্যান্ডার্ড।

'abc'.repeat(3); //abcabcabc

চমৎকার! .. তবে আমার জন্য ব্যবহারযোগ্য নয় (এটি আইওএস
বেঞ্জামিন

@ বেঞ্জামিন লিঙ্কে পলিফিল ব্যবহার করুন।
লুইস

আমার মনে হয় একটি উত্তরযুক্ত উত্তর হওয়া উচিত ।
টেস্ট 30

17

পি.বাইলির সমাধান বিস্তৃত :

String.prototype.repeat = function(num) {
    return new Array(isNaN(num)? 1 : ++num).join(this);
    }

এইভাবে আপনার অপ্রত্যাশিত যুক্তির ধরণগুলি থেকে নিরাপদ থাকা উচিত:

var foo = 'bar';
alert(foo.repeat(3));              // Will work, "barbarbar"
alert(foo.repeat('3'));            // Same as above
alert(foo.repeat(true));           // Same as foo.repeat(1)

alert(foo.repeat(0));              // This and all the following return an empty
alert(foo.repeat(false));          // string while not causing an exception
alert(foo.repeat(null));
alert(foo.repeat(undefined));
alert(foo.repeat({}));             // Object
alert(foo.repeat(function () {})); // Function

সম্পাদনা: তার মার্জিত ধারণার জন্য ক্রেডিট জেরোন++num !


2
আপনার কিছুটা পরিবর্তিত হয়েছে:String.prototype.repeat = function(n){return new Array(isNaN(n) ? 1 : ++n).join(this);}
জেরোন

যাইহোক এই পরীক্ষা অনুসারে ( jsperf.com/string-repeat/2 ) স্ট্রিং কনক্যাট্যানেশন সহ লুপের জন্য সহজ কাজ করা অ্যারে.জোঁইন ব্যবহারের তুলনায় ক্রোমে খুব দ্রুততর বলে মনে হচ্ছে। মজার না?!
মার্কো ডেমাইও


5
/**  
@desc: repeat string  
@param: n - times  
@param: d - delimiter  
*/

String.prototype.repeat = function (n, d) {
    return --n ? this + (d || '') + this.repeat(n, d) : '' + this
};

ডেলিমেটার ব্যবহার করে এভাবে কয়েকবার স্ট্রিংটি পুনরাবৃত্তি করা যায়।


4

বিচ্ছুরিত উত্তরের জন্য এখানে 5-7% উন্নতি রয়েছে।

থামিয়ে লুপটি আনرول করুন এবং লুপের পরে count > 1একটি অতিরিক্ত কনক্যাট সম্পাদন করুন result += pattnern। এটি pattern += patternব্যয়বহুল যদি-চেক ব্যবহার না করে পূর্বে অব্যবহৃত লুপগুলি এড়াতে পারে । চূড়ান্ত ফলাফলটি এরকম দেখাবে:

String.prototype.repeat = function(count) {
    if (count < 1) return '';
    var result = '', pattern = this.valueOf();
    while (count > 1) {
        if (count & 1) result += pattern;
        count >>= 1, pattern += pattern;
    }
    result += pattern;
    return result;
};

এবং বিচ্ছিন্ন সংস্করণটির জন্য এখানে বিচ্ছুরিত ফিডাল কাঁটাচামচ করা হয়েছে: http://jsfiddle.net/wsdfg/


2
function repeat(s, n) { var r=""; for (var a=0;a<n;a++) r+=s; return r;}

2
স্ট্রিং সংমিশ্রণ ব্যয়বহুল নয়? অন্তত জাভা ক্ষেত্রে এটি।
বিজয় দেব

হ্যাঁ তারা কেন। তবে এটি জাভাস্ক্রিপ্টে সত্যিই অনুকূলিত করা যায় না। :(
ম্যাকট্রাফিক

এই পারফরম্যান্স ইমপ্রোভমেন্ট সম্পর্কে কী বলা যায়: var r=s; for (var a=1;...:)))) যাইহোক এই পরীক্ষা অনুসারে ( jsperf.com/string-repeat/2 ) স্ট্রিং কনটেন্টেশন সহ লুপের জন্য সহজ করার মতো যা আপনি পরামর্শ করেছিলেন ক্রমের উপরে অ্যারের ব্যবহারের তুলনায় দ্রুত গতিতে বলে মনে হচ্ছে .join।
মার্কো ডেমাইও

@ বিজয়দেব - এই পরীক্ষার অনুসারে নয়: jsperf.com/ultimate-concat-vs-join
jbyrd

2

বিভিন্ন পদ্ধতির পরীক্ষা:

var repeatMethods = {
    control: function (n,s) {
        /* all of these lines are common to all methods */
        if (n==0) return '';
        if (n==1 || isNaN(n)) return s;
        return '';
    },
    divideAndConquer:   function (n, s) {
        if (n==0) return '';
        if (n==1 || isNaN(n)) return s;
        with(Math) { return arguments.callee(floor(n/2), s)+arguments.callee(ceil(n/2), s); }
    },
    linearRecurse: function (n,s) {
        if (n==0) return '';
        if (n==1 || isNaN(n)) return s;
        return s+arguments.callee(--n, s);
    },
    newArray: function (n, s) {
        if (n==0) return '';
        if (n==1 || isNaN(n)) return s;
        return (new Array(isNaN(n) ? 1 : ++n)).join(s);
    },
    fillAndJoin: function (n, s) {
        if (n==0) return '';
        if (n==1 || isNaN(n)) return s;
        var ret = [];
        for (var i=0; i<n; i++)
            ret.push(s);
        return ret.join('');
    },
    concat: function (n,s) {
        if (n==0) return '';
        if (n==1 || isNaN(n)) return s;
        var ret = '';
        for (var i=0; i<n; i++)
            ret+=s;
        return ret;
    },
    artistoex: function (n,s) {
        var result = '';
        while (n>0) {
            if (n&1) result+=s;
            n>>=1, s+=s;
        };
        return result;
    }
};
function testNum(len, dev) {
    with(Math) { return round(len+1+dev*(random()-0.5)); }
}
function testString(len, dev) {
    return (new Array(testNum(len, dev))).join(' ');
}
var testTime = 1000,
    tests = {
        biggie: { str: { len: 25, dev: 12 }, rep: {len: 200, dev: 50 } },
        smalls: { str: { len: 5, dev: 5}, rep: { len: 5, dev: 5 } }
    };
var testCount = 0;
var winnar = null;
var inflight = 0;
for (var methodName in repeatMethods) {
    var method = repeatMethods[methodName];
    for (var testName in tests) {
        testCount++;
        var test = tests[testName];
        var testId = methodName+':'+testName;
        var result = {
            id: testId,
            testParams: test
        }
        result.count=0;

        (function (result) {
            inflight++;
            setTimeout(function () {
                result.start = +new Date();
                while ((new Date() - result.start) < testTime) {
                    method(testNum(test.rep.len, test.rep.dev), testString(test.str.len, test.str.dev));
                    result.count++;
                }
                result.end = +new Date();
                result.rate = 1000*result.count/(result.end-result.start)
                console.log(result);
                if (winnar === null || winnar.rate < result.rate) winnar = result;
                inflight--;
                if (inflight==0) {
                    console.log('The winner: ');
                    console.log(winnar);
                }
            }, (100+testTime)*testCount);
        }(result));
    }
}


2

সমস্ত ব্রাউজারের জন্য

এটি যতটা সংক্ষিপ্তভাবে এটি পায়:

function repeat(s, n) { return new Array(n+1).join(s); }

আপনি যদি পারফরম্যান্স সম্পর্কেও চিন্তা করেন তবে এটি একটি আরও ভাল পদ্ধতির:

function repeat(s, n) { var a=[],i=0;for(;i<n;)a[i++]=s;return a.join(''); }

আপনি যদি উভয় বিকল্পের পারফরম্যান্সের তুলনা করতে চান তবে এই ফিডল এবং এই ফিডলটি দেখুন বেঞ্চমার্ক পরীক্ষার জন্য । আমার নিজের পরীক্ষাগুলির সময়, দ্বিতীয় বিকল্পটি ফায়ারফক্সে প্রায় 2 গুণ এবং ক্রোমে প্রায় 4 গুণ দ্রুত ছিল!

শুধুমাত্র আধুনিক ব্রাউজারগুলির জন্য:

আধুনিক ব্রাউজারগুলিতে আপনি এখন এটি করতে পারেন:

function repeat(s,n) { return s.repeat(n) };

এই বিকল্পটি কেবলমাত্র অন্য দুটি বিকল্পের চেয়ে ছোট নয়, তবে এটি দ্বিতীয় বিকল্পের চেয়েও দ্রুত

দুর্ভাগ্যক্রমে, এটি ইন্টারনেট এক্সপ্লোরারের কোনও সংস্করণে কাজ করে না। সারণীতে থাকা সংখ্যাগুলি প্রথম ব্রাউজার সংস্করণ নির্দিষ্ট করে যা পদ্ধতিটিকে পুরোপুরি সমর্থন করে:

এখানে চিত্র বর্ণনা লিখুন


2
function repeat(pattern, count) {
  for (var result = '';;) {
    if (count & 1) {
      result += pattern;
    }
    if (count >>= 1) {
      pattern += pattern;
    } else {
      return result;
    }
  }
}

আপনি এটি জেএসফিডেলে পরীক্ষা করতে পারেন । হ্যাকি Array.joinএবং মাইয়ের বিপরীতমুখী , মোটামুটিভাবে বলতে গেলে, 10 (ক্রোম) থেকে 100 (সাফারি) থেকে 200 (ফায়ারফক্স) গুন দ্রুত (ব্রাউজারের উপর নির্ভরশীল ) is


2

শুধু অন্য পুনরাবৃত্তি ফাংশন:

function repeat(s, n) {
  var str = '';
  for (var i = 0; i < n; i++) {
    str += s;
  }
  return str;
}

2

ES2015এই repeat()পদ্ধতি উপলব্ধি করা হয়েছে !

http://www.ecma-international.org/ecma-262/6.0/#sec-string.prototype.repeat
https://developer.mozilla.org/en-US/docs/Web/JavaScript/References/ গ্লোবাল_অবজেক্টস / স্ট্রিং / পুনরাবৃত্তি
http://www.w3schools.com/jsref/jsref_repeat.asp

/** 
 * str: String
 * count: Number
 */
const str = `hello repeat!\n`, count = 3;

let resultString = str.repeat(count);

console.log(`resultString = \n${resultString}`);
/*
resultString = 
hello repeat!
hello repeat!
hello repeat!
*/

({ toString: () => 'abc', repeat: String.prototype.repeat }).repeat(2);
// 'abcabc' (repeat() is a generic method)

// Examples

'abc'.repeat(0);    // ''
'abc'.repeat(1);    // 'abc'
'abc'.repeat(2);    // 'abcabc'
'abc'.repeat(3.5);  // 'abcabcabc' (count will be converted to integer)
// 'abc'.repeat(1/0);  // RangeError
// 'abc'.repeat(-1);   // RangeError


1

এটি সবচেয়ে ছোট পুনরাবৃত্তি হতে পারে: -

String.prototype.repeat = function(n,s) {
s = s || ""
if(n>0) {
   s += this
   s = this.repeat(--n,s)
}
return s}


1

সাধারণ পুনরাবৃত্তিমূলক কনটেন্টেশন

আমি কেবল এটি একটি ব্যাশ দিতে চেয়েছি এবং এটি তৈরি করেছি:

function ditto( s, r, c ) {
    return c-- ? ditto( s, r += s, c ) : r;
}

ditto( "foo", "", 128 );

আমি বলতে পারি না যে আমি এটি অনেক চিন্তা দিয়েছিলাম এবং এটি সম্ভবত :-) দেখায়

এটি যুক্তিযুক্তভাবে ভাল

String.prototype.ditto = function( c ) {
    return --c ? this + this.ditto( c ) : this;
};

"foo".ditto( 128 );

এবং এটি অনেক ইতিমধ্যে পোস্ট করা উত্তরগুলির মতো - আমি এটি জানি।

তবে কেন আদৌ পুনরুক্তি হবে?

এবং কিভাবে একটি সামান্য ডিফল্ট আচরণ সম্পর্কে?

String.prototype.ditto = function() {
    var c = Number( arguments[ 0 ] ) || 2,
        r = this.valueOf();
    while ( --c ) {
        r += this;
    }
    return r;
}

"foo".ditto();

কারণ , যদিও নন রিকার্সিভ পদ্ধতি কল স্ট্যাক সীমাতে আঘাত না করে নির্বিচারে বড় পুনরাবৃত্তি পরিচালনা করবে, এটি অনেক ধীর।

আমি কেন আরও এমন পদ্ধতি যুক্ত করতে বিরক্ত করেছিলাম যা চতুর হিসাবে অর্ধেক নয়ইতিমধ্যে পোস্ট করা ?

আংশিকভাবে আমার নিজের বিনোদনের জন্য, এবং আংশিকভাবে আমি সহজ পদ্ধতিতে নির্দেশ করতে চাই যে একটি বিড়ালকে ত্বকে নেওয়ার বিভিন্ন উপায় রয়েছে এবং পরিস্থিতিটির উপর নির্ভর করে এটি সম্ভবত সম্ভব যে আপাতত সর্বোত্তম পদ্ধতিটি আদর্শ নয়।

একটি অপেক্ষাকৃত দ্রুত এবং পরিশীলিত পদ্ধতি কার্যকরভাবে ক্র্যাশ এবং নির্দিষ্ট পরিস্থিতিতে জ্বলতে পারে, যদিও একটি ধীর এবং সহজ পদ্ধতি কাজটি শেষ করতে পারে - শেষ পর্যন্ত।

কিছু পদ্ধতি একটু বেশি কীর্তিকলাপ চেয়ে হতে পারে, এবং এই ধরনের প্রবণ যেমন হচ্ছে ফিক্সড অস্তিত্ব থেকে ও অন্যান্য পদ্ধতি সব অবস্থায় সুন্দর কাজ করতে পারে, কিন্তু তাই নির্মাণ হয় এক কেবল কোন ধারণা কিভাবে এটি কাজ করে হয়েছে।

"তাহলে কীভাবে কাজ হয় যদি আমি জানি না !!"

সিরিয়াসলি?

জাভাস্ক্রিপ্ট এর অন্যতম বৃহত শক্তি থেকে ভুগছে; এটি খারাপ আচরণের পক্ষে অত্যন্ত সহনশীল এবং ফলাফলগুলি ফিরিয়ে আনতে এটি নমনীয় হয়ে উঠবে, যখন এটি যদি না ছড়িয়ে পড়ে তবে সবার পক্ষে ভাল হত!

"মহান শক্তি দিয়ে মহান দায়িত্ব আসে" ;-)

তবে আরও গুরুত্ব সহকারে এবং গুরুত্বপূর্ণভাবে, যদিও এর মতো সাধারণ প্রশ্নগুলি চতুর উত্তরগুলির আকারে অদ্ভুততার দিকে পরিচালিত করে যে অন্য কিছু না হলে নিজের জ্ঞান এবং দিগন্তকে প্রসারিত করে, শেষ পর্যন্ত, হাতের কাজ - ফলস্বরূপ পদ্ধতিটি ব্যবহার করে এমন ব্যবহারিক লিপি - একটু কম, বা আরও কিছু চালাকের প্রয়োজন হতে পারে চেয়ে পরামর্শ দেওয়া হয়।

এই "নিখুঁত" অ্যালগরিদমগুলি মজাদার এবং সমস্ত, তবে "একটি আকার সবই ফিট করে" খুব কমই যদি দর্জি তৈরির চেয়ে ভাল হয়।

এই খুতবাটি আপনার কাছে নিদ্রার অভাব এবং উত্তীর্ণ আগ্রহের সৌজন্যে আনা হয়েছিল। এগিয়ে যান এবং কোড!


1

প্রথমত, ও.পি. এর প্রশ্নগুলি সংক্ষিপ্ততার বিষয়ে বলে মনে হয় - যা আমি "সহজ এবং সহজভাবে পড়তে সহজ" বলতে বোঝি, যখন বেশিরভাগ উত্তরগুলি দক্ষতা সম্পর্কে বলে মনে হয় - যা স্পষ্টতই একই জিনিস নয় এবং আমি মনে করি যে আপনি যদি কিছু বাস্তবায়ন না করেন তবে অ্যালগরিদমগুলি সুনির্দিষ্ট বড় ডেটা ম্যানিপুলেট করে যখন আপনি বুনিয়াদি ডেটা ম্যানিপুলেশন জাভাস্ক্রিপ্ট ফাংশনগুলি প্রয়োগ করতে আসেন তখন আপনাকে চিন্তিত করা উচিত নয়। নিবিড়তা আরও গুরুত্বপূর্ণ।

দ্বিতীয়ত, আন্দ্রে লাসল্লো যেমন উল্লেখ করেছেন, স্ট্রিং.রেপিয়াট এটি ইসমাস্ক্রিপ্ট part এর অংশ এবং এটি ইতিমধ্যে বেশ কয়েকটি জনপ্রিয় বাস্তবায়নে পাওয়া যায় - সুতরাং এর সর্বাধিক সংক্ষিপ্ত String.repeatবাস্তবায়ন এটি বাস্তবায়ন করা নয় ;-)

শেষ অবধি, আপনার যদি এমন হোস্টকে সমর্থন করতে হয় যা ECMAScript 6 টি প্রয়োগের প্রস্তাব দেয় না, তবে আন্দ্রে লাসজ্লো দ্বারা উল্লিখিত MDN এর পলিফিল সংক্ষিপ্ত কিছু নয়।

সুতরাং, আরও অগ্রগতি ছাড়াই - এখানে আমার সংক্ষিপ্ত পলিফিল:

String.prototype.repeat = String.prototype.repeat || function(n){
    return n<=1 ? this : this.concat(this.repeat(n-1));
}

হ্যাঁ, এটি একটি পুনরাবৃত্তি। আমি পুনরাবৃত্তি পছন্দ করি - এগুলি সহজ এবং সঠিকভাবে করা হয়ে থাকলে বোঝা সহজ। দক্ষতা সম্পর্কে, ভাষা যদি এটি সমর্থন করে তবে সঠিকভাবে লেখা থাকলে তারা খুব দক্ষ হতে পারে।

আমার পরীক্ষাগুলি থেকে, এই পদ্ধতিটি Array.joinপদ্ধতির চেয়ে ~ 60% দ্রুত । যদিও এটি স্পষ্টতই কাছাকাছি বিচ্ছিন্নকরণের বাস্তবায়ন আসে না, এটি উভয়ের চেয়ে অনেক সহজ।

আমার পরীক্ষা সেটআপ নোড v0.10 (আমি এটা কিছু বাছাই সম্ভব মনে হয় "কঠোর মোড" ব্যবহার করছে TCO ), কলিং repeat(1000)লক্ষ গুণ 10 অক্ষর স্ট্রিং উপর।


1

আপনি যদি মনে করেন যে এই সমস্ত প্রোটোটাইপ সংজ্ঞা, অ্যারে ক্রিয়েশন, এবং যোগদানের ক্রিয়াকলাপগুলি ওভারকিল, কেবলমাত্র একটি একক লাইন কোড ব্যবহার করুন যেখানে আপনার এটি প্রয়োজন। স্ট্রিং এস পুনরাবৃত্তি এন বার:

for (var i = 0, result = ''; i < N; i++) result += S;

3
কোড পাঠযোগ্য হবে। আপনি যদি আক্ষরিকভাবে কেবল একবার এটি ব্যবহার করতে যাচ্ছেন তবে তা সঠিকভাবে ফর্ম্যাট করুন (বা Array(N + 1).join(str)পদ্ধতিটি যদি কোনও পারফরম্যান্স বাধা না হয়)। যদি আপনি এটির দু'বার ব্যবহার করার সামান্যতম সুযোগও পান তবে এটি যথাযথ-নামক কার্যক্রমে নিয়ে যান।
ক্লাউডফিট

1

জাভা স্ক্রিপ্ট ইউটিলিটি কার্যকারিতার জন্য লোড্যাশ ব্যবহার করুন, যেমন স্ট্রিং পুনরাবৃত্তি করা।

লোডাশ দুর্দান্ত পারফরম্যান্স এবং ECMAScript সামঞ্জস্যতা সরবরাহ করে।

আমি এটির ইউআই বিকাশের জন্য অত্যন্ত পরামর্শ দিচ্ছি এবং এটি সার্ভারের পক্ষেও ভাল কাজ করে।

লোড্যাশ ব্যবহার করে কীভাবে "yo" স্ট্রিংটি 2 বার পুনরায় করা যায় তা এখানে:

> _.repeat('yo', 2)
"yoyo"

0

বিভাজন এবং বিজয় ব্যবহার করে পুনরাবৃত্ত সমাধান:

function repeat(n, s) {
    if (n==0) return '';
    if (n==1 || isNaN(n)) return s;
    with(Math) { return repeat(floor(n/2), s)+repeat(ceil(n/2), s); }
}

0

আমি এখানে এলোমেলোভাবে এসেছি এবং এর আগে জাভাস্ক্রিপ্টে কোনও চর পুনরাবৃত্তি করার কারণ ছিল না।

আমি আর্টিস্টোেক্সের এটি করার পদ্ধতি এবং বিচ্ছুরিত ফলাফল দেখে মুগ্ধ হয়েছি। আমি লক্ষ্য করেছি যে শেষ স্ট্রিং কনক্যাটটি অপ্রয়োজনীয় ছিল, যেমন ডেনিসও উল্লেখ করেছিলেন।

স্যাম্পলিং বিচ্ছিন্নভাবে একসাথে রেখে খেলতে গিয়ে আমি আরও কয়েকটি জিনিস লক্ষ্য করেছি।

ফলাফলগুলি সর্বদা শেষ রানের পক্ষে যথেষ্ট পরিমাণে বৈচিত্র্যযুক্ত এবং অনুরূপ অ্যালগোরিদম প্রায়শই পজিশনের জন্য জকি। আমি পরিবর্তিত জিনিসগুলির মধ্যে একটি ছিল কলটির বীজ হিসাবে জেএসলিটমাস উত্পন্ন গণনাটি ব্যবহার না করে; গণনাটি বিভিন্ন পদ্ধতির জন্য আলাদাভাবে উত্পন্ন হয়েছিল বলে আমি একটি সূচক রেখেছি। এটি জিনিসটিকে অনেক বেশি নির্ভরযোগ্য করে তুলেছে। আমি তখন বিভিন্ন ধরণের স্ট্রিংগুলি ফাংশনগুলিতে প্রেরণ করা হয়েছে তা নিশ্চিত করে দেখেছি। এটি আমি দেখেছি এমন কিছু প্রকারভেদগুলি রোধ করেছে, যেখানে কিছু অ্যালগরিদম একক অক্ষর বা ছোট স্ট্রিংগুলিতে আরও ভাল করেছে। তবে শীর্ষ 3 পদ্ধতি সমস্ত স্ট্রিং আকার নির্বিশেষে ভাল করেছে।

কাঁটাচামচ পরীক্ষা সেট

http://jsfiddle.net/schmide/fCqp3/134/

// repeated string
var string = '0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789';
// count paremeter is changed on every test iteration, limit it's maximum value here
var maxCount = 200;

var n = 0;
$.each(tests, function (name) {
    var fn = tests[name];
    JSLitmus.test(++n + '. ' + name, function (count) {
        var index = 0;
        while (count--) {
            fn.call(string.slice(0, index % string.length), index % maxCount);
            index++;
        }
    });
    if (fn.call('>', 10).length !== 10) $('body').prepend('<h1>Error in "' + name + '"</h1>');
});

JSLitmus.runAll();

আমি তখন ডেনিসের সংশোধনটি অন্তর্ভুক্ত করেছিলাম এবং আরও কিছু খুঁজে বের করার কোনও উপায় খুঁজে পেতে পারি কিনা তা দেখার সিদ্ধান্ত নিয়েছিলাম।

যেহেতু জাভাস্ক্রিপ্ট আসলে জিনিসগুলিকে অনুকূলিত করতে পারে না, তাই কর্মক্ষমতা উন্নয়নের সর্বোত্তম উপায় হ'ল ম্যানুয়ালি জিনিস এড়ানো। যদি আমি লুপের বাইরে প্রথম 4 টি তুচ্ছ ফলাফল গ্রহণ করি তবে আমি 2-4 স্ট্রিং স্টোর এড়াতে পারি এবং ফলাফলের সাথে সরাসরি চূড়ান্ত স্টোর লিখতে পারি।

// final: growing pattern + prototypejs check (count < 1)
'final avoid': function (count) {
    if (!count) return '';
    if (count == 1) return this.valueOf();
    var pattern = this.valueOf();
    if (count == 2) return pattern + pattern;
    if (count == 3) return pattern + pattern + pattern;
    var result;
    if (count & 1) result = pattern;
    else result = '';
    count >>= 1;
    do {
        pattern += pattern;
        if (count & 1) result += pattern;
        count >>= 1;
    } while (count > 1);
    return result + pattern + pattern;
}

এটি ডেনিসের ফিক্সের তুলনায় গড়ে 1-2% উন্নতি করেছে। যাইহোক, বিভিন্ন রান এবং বিভিন্ন ব্রাউজারগুলি যথেষ্ট পরিমাণে বৈকল্পিকতা দেখাতে পারে যে এই অতিরিক্ত কোডটি সম্ভবত 2 পূর্ববর্তী অ্যালগরিদমের চেয়ে বেশি চেষ্টা করার মতো নয়।

একটি তালিকা

সম্পাদনা: আমি বেশিরভাগ ক্রোমের অধীনে এটি করেছি। ফায়ারফক্স এবং আইই প্রায়শই একটি দম্পতি% দ্বারা ডেনিসকে সমর্থন করবে।



0

লোকেরা এটি একটি হাস্যকর পরিমাণে বা অপব্যয় কর্মক্ষমতা পর্যন্ত অতি জটিল করে তোলে। অ্যারেগুলির? Recursion? আপনি আমাকে, মজা পেয়েছেন.

function repeat (string, times) {
  var result = ''
  while (times-- > 0) result += string
  return result
}

সম্পাদনা করুন। আমি আর্টিস্টোএক্স / ডিসফেটেড এবং অন্যান্য লোকদের একগুচ্ছ পোস্ট করা বিটওয়াইজ সংস্করণটির সাথে তুলনা করার জন্য কয়েকটি সাধারণ পরীক্ষা চালিয়েছি some পরবর্তীটি কেবলমাত্র সামান্য দ্রুত ছিল, তবে আরও মেমরি-দক্ষতার প্রস্থের আদেশ। 'ব্লাহ' শব্দের 1000000 পুনরাবৃত্তিগুলির জন্য, নোড প্রক্রিয়াটি সরল কনট্যাকটেশন অ্যালগরিদম (উপরে) দিয়ে 46 মেগাবাইটে উঠেছিল তবে লোগারিদমিক অ্যালগরিদমের সাথে কেবল 5.5 মেগাবাইট রয়েছে। দ্বিতীয়টি অবশ্যই যাওয়ার উপায়। স্পষ্টতার জন্য এটি পুনরায় পোস্ট করা:

function repeat (string, times) {
  var result = ''
  while (times > 0) {
    if (times & 1) result += string
    times >>= 1
    string += string
  }
  return result
}

আপনি string += stringসময় একটি অপ্রয়োজনীয় ।
নিকোলে

0

সংখ্যার উপর ভিত্তি করে স্ট্রিং কনটেনেটিং।

function concatStr(str, num) {
   var arr = [];

   //Construct an array
   for (var i = 0; i < num; i++)
      arr[i] = str;

   //Join all elements
   str = arr.join('');

   return str;
}

console.log(concatStr("abc", 3));

আশা করি এইটি কাজ করবে!


0

ES8 আপনি এছাড়াও ব্যবহার করতে পারে padStartবা padEndএই জন্য। যেমন।

var str = 'cat';
var num = 23;
var size = str.length * num;
"".padStart(size, str) // outputs: 'catcatcatcatcatcatcatcatcatcatcatcatcatcatcatcatcatcatcatcatcatcatcat'
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.