জাভাস্ক্রিপ্টের বাছাই () কীভাবে কাজ করে?


95

নীচের কোডগুলি এই অ্যারেটিকে সংখ্যাসমৃদ্ধে বাছাই করে?

var array=[25, 8, 7, 41]

array.sort(function(a,b){
  return a - b
})

আমি জানি যে যদি গণনার ফলাফল হয় ...

0 এর চেয়ে কম : "এ" "বি" এর চেয়ে নিম্ন সূচক হিসাবে বাছাই করা হয়।
শূন্য: "ক" এবং "বি" সমান হিসাবে বিবেচিত হয় এবং কোনও বাছাই করা হয় না।
0 এর চেয়ে বড়: "বি" "এ" এর চেয়ে নিম্ন সূচক হিসাবে বাছাই করা হয়।

বাছাইয়ের সময় অ্যারে সাজানো কলব্যাক ফাংশনটি কি অনেক বার বলা হয়?

যদি তা হয় তবে আমি জানতে চাই যে প্রতিটি বার দুটি ফাংশনে কোন দুটি সংখ্যা পাস হবে। আমি ধরে নিয়েছি এটি প্রথমে "25" (ক) এবং "8" (খ) নিয়েছে, তারপরে "7" (ক) এবং "41" (খ) রয়েছে, সুতরাং:

25 (ক) - 8 (খ) = 17 (শূন্যের চেয়ে বড়, সুতরাং "বি" কে "এ" এর চেয়ে নিম্ন সূচক হতে বাছাই করুন): 8, 25

7 (ক) - 41 (বি) = -34 (শূন্যের চেয়ে কম, সুতরাং "এ" "বি" এর চেয়ে নিম্ন সূচক হতে বাছাই করুন: 7, 41

তখন দুটি সেট সংখ্যার একে অপরের সাথে কীভাবে সাজানো হয়?

একটি সংগ্রামী নবাগত সাহায্য করুন!


4
আমি আশা করি এটি কিছুটা বুদ্ধিমান হয়ে উঠবে!
cw84

উত্তর:


51

বাছাইয়ের সময় অ্যারে সাজানো কলব্যাক ফাংশনটি কি অনেক বার বলা হয়?

হ্যাঁ

যদি তা হয় তবে আমি জানতে চাই যে প্রতিটি বার দুটি ফাংশনে কোন দুটি সংখ্যা পাস হবে

আপনি এটির মাধ্যমে নিজের স্ব আবিষ্কার করতে পারেন:

array.sort((a,b) => {
  console.log(`comparing ${a},${b}`);
  return a > b ? 1
               : a === b ? 0 
                         : -1;
});

সম্পাদনা

এটি আমি পেয়েছি আউটপুট:

25,8
25,7
8,7
25,41

8
বরং ফায়ারব্যাগ বা এইচটিএমএল ডিআইভি উপাদানগুলির .innerHTML + = "তুলনা" + এ + "," + বি + "\ n" এ একটি কনসোল.লগ করুন;
জোশুয়া

4
মনে রাখবেন যে এটি একটি উইকের মতো সাইট এবং আমরা অন্যকে আরও উন্নত করতে উত্তরগুলি সম্পাদনা করতে পারি :)
পাবলো ফার্নান্দেজ

7
নতুন নতুন ES6 সিনট্যাক্সের জন্য কেবল একটি নোট: array.sort((a,b) => a - b);বৈধ বাক্য গঠন
স্টার্লিং আর্চার

4
যদি সাজানোর ফাংশনটি ফিরে আসে - তবে তা অদলবদল করে এবং + Ve হয় তবে তা অদলবদল হয় না ??
মাহি

4
@ শেখেরেডি আপনি এখনও তুলনা করতে অপারেটর ব্যবহার করতে পারেন। আমি উত্তর আপডেট করেছি।
অস্কাররাজ

44

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

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

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

আপনার নির্দিষ্ট জাভাস্ক্রিপ্ট ইন্টারপ্রেটার সেই আলগোরিদিমগুলির মধ্যে একটি বা সম্পূর্ণ অন্য কোনও কিছু ব্যবহার করতে পারে। এর নাম ECMAScript প্রমিত নির্দিষ্ট করে না যা অ্যালগরিদম একটি অনুসারী বাস্তবায়ন ব্যবহার করা আবশ্যক। এটি স্থিতিশীলতার জন্য স্পষ্টতই অস্বীকার করে।


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

4
জাভাস্ক্রিপ্টকরে আসলে বাছাইয়ের জন্য একটি এভিএল ট্রি ব্যবহার করা হয় কারণ তুলনামূলক ফাংশনগুলির মধ্যে যে অ্যারেটি সাজানো হচ্ছে তা পরিবর্তিত করে ডিটারনেস্টিকভাবে আচরণ করা প্রয়োজন।
ollলিজে

ইসমাস্ক্রিপ্ট স্ট্যান্ডার্ডটির এখন স্থায়িত্ব প্রয়োজন
ggorlen

11

মানগুলির জোড়গুলি তুলনা করা হয়, একবারে এক জোড়া। যে জোড়গুলির সাথে তুলনা করা হয় তা একটি বাস্তবায়ন বিশদ - ধরে নিবেন না যে প্রতিটি ব্রাউজারে সেগুলি এক রকম হবে। কলব্যাক যে কোনও কিছু হতে পারে (যাতে আপনি স্ট্রিং বা রোমান সংখ্যাসমূহ বা যে কোনও কিছু যেখানে আপনি একটি ফাংশন নিয়ে আসতে পারেন যেখানে 1,0, -1 ফিরে আসে) বাছাই করতে পারেন।

জাভাস্ক্রিপ্টের ধরণের সাথে মনে রাখার একটি বিষয় হ'ল এটি স্থিতিশীল হওয়ার নিশ্চয়তা নেই।


5

বাছাইয়ের সময় অ্যারে সাজানো কলব্যাক ফাংশনটি কি অনেক বার বলা হয়?

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


4

বাছাইয়ের সময় অ্যারে সাজানো কলব্যাক ফাংশনটি কি অনেক বার বলা হয়?

এটি যেহেতু এন আইটেমগুলি দেওয়া হয় তার তুলনা বাছাই, কলব্যাক্টের মতো দ্রুত সাজানোর জন্য কলব্যাক ফাংশনটি গড়ে (N * Lg N) বার করা উচিত । যদি ব্যবহৃত অ্যালগরিদম বুদ্বুদ সাজানোর মতো কিছু হয় তবে কলব্যাক ফাংশনটি গড়ে (এন * এন) বার শুরু করা হবে।

তুলনা বাছাইয়ের জন্য অনুরোধের সর্বনিম্ন সংখ্যা হ'ল (এন -১) এবং এটি কেবল একটি ইতিমধ্যে বাছাই করা তালিকাটি সনাক্ত করতে পারে (অর্থাত্‍ যদি কোনও অদলবস্থা না ঘটে তবে বুদ্বুদ সাজানোর প্রথম দিকে)।


3

গভীর জ্ঞান

ফলাফলটি নেতিবাচক হলে খ এর আগে বাছাই করা হয়।

ফলাফলটি ইতিবাচক হলে খ এর পূর্বে বাছাই করা হয়।

ফলাফল যদি 0 হয় তবে দুটি মানের ক্রমানুসারে কোনও পরিবর্তন করা হবে না।

বিঃদ্রঃ:

এই কোডটি ধাপে ধাপে বাছাইয়ের পদ্ধতিটির অভ্যন্তরীণ ভিউ

আউটপুট:

let arr = [90, 1, 20, 14, 3, 55];
var sortRes = [];
var copy = arr.slice();		//create duplicate array
var inc = 0;	//inc meant increment
copy.sort((a, b) => {
	sortRes[inc] = [ a, b, a-b ];
	inc += 1;
	return a - b;
});
var p = 0;
for (var i = 0; i < inc; i++) {
	copy = arr.slice();
	copy.sort((a, b) => {
		p += 1;
		if (p <= i ) {
			return a - b;
		}
		else{
			return false;
		}
	});
	p = 0;
	console.log(copy +' \t a: '+ sortRes[i][0] +' \tb: '+ sortRes[i][1] +'\tTotal: '+ sortRes[i][2]);
}


0

এই কোড চালান। শুরু থেকে শেষ পর্যন্ত ধাপে ধাপে সাজানোর প্রক্রিয়াটি আপনি দেখতে পাচ্ছেন।

var array=[25, 8, 7, 41]
var count = 1;
array.sort( (a,b) => { 
console.log(`${count++}). a: ${a} | b: ${b}`);
return a-b;
});
console.log(array);

অনুলিপি করে অনুলিপি করা হয়েছে এবং এটি ঠিক অপরিবর্তিত রয়েছে।
আইপজার্ড

0

এর আচরণ Array#sortএবং এর তুলনাকারী স্পষ্ট করতে সহায়তা করার জন্য , প্রোগ্রামিং কোর্সের শুরুতে শেখানো এই নিষ্পাপ সন্নিবেশ সাজানোর বিষয়টি বিবেচনা করুন :

const sort = arr => {
  for (let i = 1; i < arr.length; i++) {
    for (let j = i; j && arr[j-1] > arr[j]; j--) {
      [arr[j], arr[j-1]] = [arr[j-1], arr[j]];
    }
  }
};

const array = [3, 0, 4, 5, 2, 2, 2, 1, 2, 2, 0];
sort(array);
console.log("" + array);

অ্যালগরিদম উপর ফোকাস হিসাবে সন্নিবেশ সাজানোর পছন্দ উপেক্ষা হার্ডকোডেড comparator: arr[j-1] > arr[j]। এটি আলোচনার সাথে প্রাসঙ্গিক দুটি সমস্যা রয়েছে:

  1. >অপারেটর অ্যারে উপাদানের কিন্তু অনেক কিছুর পেয়ারে প্রার্থনা করা হয় বস্তু জবাব দেবেন না কারণ আপনি এই ধরনের বাছাই করতে চাইতে পারেন >একটি যুক্তিসঙ্গত উপায় (যদি আমরা ব্যবহৃত একই সত্য হতে করবে- )।
  2. এমনকি যদি আপনি সংখ্যার সাথে কাজ করে থাকেন তবে প্রায়শই আপনি এখানে বর্ধিত আরোহী বাছাইয়ের চেয়ে অন্য কোনও ব্যবস্থা চান।

comparefnআপনার সাথে পরিচিত এমন একটি যুক্তি যুক্ত করে আমরা এই সমস্যাগুলি সমাধান করতে পারি :

const sort = (arr, comparefn) => {
  for (let i = 1; i < arr.length; i++) {
    for (let j = i; j && comparefn(arr[j-1], arr[j]) > 0; j--) {
      [arr[j], arr[j-1]] = [arr[j-1], arr[j]];
    }
  }
};

const array = [3, 0, 4, 5, 2, 2, 2, 1, 2, 2, 0];
sort(array, (a, b) => a - b);
console.log("" + array);

sort(array, (a, b) => b - a);
console.log("" + array);

const objArray = [{id: "c"}, {id: "a"}, {id: "d"}, {id: "b"}];
sort(objArray, (a, b) => a.id.localeCompare(b.id));
console.log(JSON.stringify(objArray, null, 2));

এখন নিষ্পাপ সাজানোর রুটিনটি সাধারণীকরণ করা হয়। আপনার উদ্বেগের প্রথম সেটটির উত্তর দিয়ে আপনি এই কলব্যাকটি কখন ডাকা হবে তা ঠিক দেখতে পাবেন:

বাছাইয়ের সময় অ্যারে সাজানো কলব্যাক ফাংশনটি কি অনেক বার বলা হয়? যদি তা হয় তবে আমি জানতে চাই যে প্রতিটি বার দুটি ফাংশনে কোন দুটি সংখ্যা পাস হবে

নীচের কোডটি চালানো থেকে বোঝা যায় যে, হ্যাঁ, ফাংশনটি অনেকবার বলা হয় এবং আপনি console.logকোন নম্বরটি পাস হয়েছিল তা দেখতে ব্যবহার করতে পারেন:

const sort = (arr, comparefn) => {
  for (let i = 1; i < arr.length; i++) {
    for (let j = i; j && comparefn(arr[j-1], arr[j]) > 0; j--) {
      [arr[j], arr[j-1]] = [arr[j-1], arr[j]];
    }
  }
};

console.log("on our version:");
const array = [3, 0, 4, 5];
sort(array, (a, b) => console.log(a, b) || (a - b));
console.log("" + array);

console.log("on the builtin:");
console.log("" + 
  [3, 0, 4, 5].sort((a, b) => console.log(a, b) || (a - b))
);

আপনি জিজ্ঞাসা:

তখন দুটি সেট সংখ্যার একে অপরের সাথে কীভাবে সাজানো হয়?

পরিভাষার সাথে সুনির্দিষ্ট হতে aএবং সংখ্যার সেটb নয় - এগুলি অ্যারেতে অবজেক্ট (আপনার উদাহরণস্বরূপ, তারা সংখ্যা)'re

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

একই অর্থে যে যতক্ষণ আমি আমার স্পেসিফিকেশন লঙ্ঘন না করে আমার সাজানোর প্রয়োগ পরিবর্তন করার স্বাধীনতা আছে, ECMAScript এর প্রয়োগগুলি ভাষার স্পেসিফিকেশনের সীমানার মধ্যে বাছাইয়ের প্রয়োগটি চয়ন Array#sortকরতে পারে , তাই সম্ভবত বিভিন্ন তুলনামূলক কল উত্পন্ন করবে বিভিন্ন ইঞ্জিনে। এমন কোনও কোড লিখবেন না যেখানে যুক্তি তুলনার কয়েকটি নির্দিষ্ট ক্রমের উপর নির্ভর করে (না তুলনাকারীর পক্ষে প্রথম দিকে পার্শ্ব প্রতিক্রিয়া তৈরি করা উচিত)।

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

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


-2
var array=[25, 8, 7, 41]

array.sort(function(a,b){
  console.log(`a = ${a} , b = ${b}`);
  return a - b
});

আউটপুট

  • a = 8, খ = 25
  • a = 7, খ = 8
  • a = 41, খ = 7
  • a = 41, খ = 8
  • a = 41, b = 25

আমার ব্রাউজারে (গুগল ক্রোম সংস্করণ 70.0.3538.77 (অফিসিয়াল বিল্ড) (-৪-বিট)) প্রথম পুনরাবৃত্তিতে, আর্গুমেন্টটি অ্যারেতে দ্বিতীয় উপাদান এবং আর্গুমেন্ট একটি অ্যারের প্রথম উপাদান

তুলনা ফাংশন যদি ফিরে আসে

  1. খ এর চেয়ে নেতিবাচক মানকে ক-এ স্থানান্তরিত করা হয়।
  2. a এর চেয়ে ধনাত্মক মান এগিয়ে যায় খ।
  3. 0 (জিরো) এন্ড বি উভয়ই যেমন থাকবে তেমন থাকবে।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.