জাভাস্ক্রিপ্ট অ্যারে বড় ও


105

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

অ্যারে পারফরম্যান্সের ক্ষেত্রে জাভাস্ক্রিপ্ট বাস্তবায়ন থেকে কী পারফরম্যান্স (বিগ ও টাইম জটিলতার নিরিখে) আমি আশা করতে পারি?

আমি ধরে নিই যে সমস্ত যুক্তিসঙ্গত জাভাস্ক্রিপ্ট প্রয়োগগুলি সর্বাধিক নিম্নলিখিত বড় ওগুলির রয়েছে।

  • অ্যাক্সেস - ও (1)
  • সংযোজন - ও (এন)
  • প্রস্তুতি - ও (এন)
  • সন্নিবেশ - ও (এন)
  • মোছা - ও (এন)
  • অদলবদল - ও (1)

জাভাস্ক্রিপ্ট আপনাকে new Array(length)সিনট্যাক্স ব্যবহার করে একটি নির্দিষ্ট আকারে একটি অ্যারে প্রাক-পূরণ করতে দেয় । (বোনাস প্রশ্ন: এই পদ্ধতিতে একটি অ্যারে তৈরি করছে ও (1) বা ও (এন)) এটি আরও প্রচলিত অ্যারের মতো এবং যদি প্রাক আকারের অ্যারে হিসাবে ব্যবহৃত হয় তবে ও (1) সংযোজনের অনুমতি দিতে পারে can যদি বিজ্ঞপ্তি বাফার যুক্তি যুক্ত হয় তবে আপনি ও (1) প্রিপেন্ডিং অর্জন করতে পারেন। যদি গতিশীলভাবে প্রসারিত অ্যারে ব্যবহার করা হয় তবে ও (লগ এন) তাদের উভয়েরই গড় ক্ষেত্রে হবে।

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

পুনশ্চ

আমি যে কারণে এটি ভাবছি তা হ'ল আমি কিছু বাছাই করা অ্যালগরিদমগুলি নিয়ে গবেষণা করছি, যার মধ্যে বেশিরভাগ মনে হয় তাদের সামগ্রিক বড় ও এর বর্ণনা দেওয়ার সময় ও (1) অপারেশনগুলি যুক্ত করা এবং মুছে ফেলা হচ্ছে operations


6
একটি আকারযুক্ত অ্যারে কনস্ট্রাক্টর আধুনিক জাভাস্ক্রিপ্ট বাস্তবায়নের ক্ষেত্রে অনেক বেশি অকেজো। এটি একক প্যারামিটার আকারে প্রায় কিছুই করে না। (এটি সেট করে .lengthতবে এটি প্রায়।) অ্যারেগুলি প্লেইন অবজেক্টের উদাহরণগুলির চেয়ে খুব বেশি আলাদা নয়।
পয়েন্টি

3
lengthসম্পত্তি নির্ধারণ এবং প্রাক-বরাদ্দ স্থান দুটি সম্পূর্ণ ভিন্ন জিনিস।
পয়েন্টি

1
@ পয়েন্ট: আমি যখন ও (1) এ সেট array[5]করার আশা করি তখন আমি কী খুব বেশি আশা করি new Array(10)?
কেন্ডল ফ্রে

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

5
@ কেন্ডালফ্রে "সেরা উত্তর" বিভিন্ন এন / অ্যাক্সেস নিদর্শনগুলির জন্য কিছু জেএসপিআইপি টেস্ট-কেস লিখতে এবং এটির কী হবে তা দেখতে পাবে সম্ভবত ;-)

উত্তর:


111

দ্রষ্টব্য: যদিও এই উত্তরটি 2012 সালে সঠিক ছিল, ইঞ্জিনগুলি আজ উভয় অবজেক্ট এবং অ্যারেগুলির জন্য খুব আলাদা অভ্যন্তরীণ উপস্থাপনা ব্যবহার করে। এই উত্তরটি সত্য হতে পারে বা নাও হতে পারে।

বেশিরভাগ ভাষার বিপরীতে, যা জাভাস্ক্রিপ্টে অ্যারেগুলি ভাল, অ্যারে দিয়ে প্রয়োগ করে, হ'ল হ্যাশটেবলে নিয়মিত বস্তুর মানগুলির মতো মানগুলি সংরক্ষণ করা হয়। যেমন:

  • অ্যাক্সেস - ও (1)
  • সংযোজন - এমোরটাইজড ও (1) (কখনও কখনও হ্যাশট্যাবলকে পুনরায় আকার দেওয়ার প্রয়োজন হয়; সাধারণত কেবল সন্নিবেশ প্রয়োজন হয়)
  • প্রস্তুতি - ও (এন) এর মাধ্যমে unshift, যেহেতু এর জন্য সমস্ত সূচী পুনরায় নিয়োগ করা প্রয়োজন
  • সন্নিবেশ - অমূল্য হে (1) যদি মানটি না থাকে। ও (এন) আপনি যদি বিদ্যমান মানগুলি (যেমন, ব্যবহার করে splice) পরিবর্তন করতে চান তবে ।
  • বিলোপ - ইমোরাইজড ও (1) কোনও মান সরিয়ে নিতে, ও (এন) আপনি যদি সূচকগুলি এর মাধ্যমে পুনরায় স্বাক্ষর করতে চান তবে splice
  • অদলবদল - ও (1)

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


4
ওপেন করা উচিত না (এন)? যেহেতু সমস্ত সূচকগুলি স্থানান্তরিত করা দরকার। সন্নিবেশ এবং মুছে ফেলার জন্য একই (স্বেচ্ছাসেবী সূচকে এবং শিফট / উপাদানগুলি ধসে)।
nhahtdh

2
এছাড়াও, lengthঅ্যারে রূপান্তর সেট করা আছে, বা getএটি দৈর্ঘ্য পেতে এবং সম্ভবত এটি স্মৃতিচারণ করতে যাচ্ছে?
অ্যালেক্স

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

4
এটি কি স্ট্যান্ডার্ড দ্বারা সংজ্ঞায়িত করা হয়েছে বা এটি কেবল জেএস ইঞ্জিনগুলিতে একটি সাধারণ বাস্তবায়ন? ভি 8 সম্পর্কে কী?
অ্যালবার্ট

4
@ বেনজামিন গ্রুয়েনবাউম আপনার কীভাবে সংরক্ষণ করা যায় সে সম্পর্কে যদি আপনি কিছুটা বিকাশ করতে পারেন তবে এটি খুব ভাল। অথবা কিছু উত্স দিন।
সিড

1

জামিন

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

বাস্তবতা

উদাহরণস্বরূপ, ভি 8 অ্যারে উপস্থাপনের জন্য হ্যাশ টেবিল এবং অ্যারে উভয় তালিকা ব্যবহার করে (আজকের হিসাবে) । এটিতে বস্তুর জন্য বিভিন্ন আলাদা উপস্থাপনাও রয়েছে তাই অ্যারে এবং অবজেক্টের তুলনা করা যায় না। সুতরাং অ্যারে অ্যাক্সেস সর্বদা ও (এন) এর চেয়ে ভাল এবং এটি সি ++ অ্যারে অ্যাক্সেসের মতো দ্রুতও হতে পারে। অতিরিক্ত সংযুক্তি হ'ল (1), যদি না আপনি ডেটাস্ট্রাকচারের আকারে পৌঁছান এবং এটি ছোট করতে হবে (যা ও (এন))। প্রস্তুতি খারাপ। আপনি যদি delete array[index](না!) এর মতো কিছু করেন তবে মুছে ফেলা আরও আরও খারাপ হতে পারে, কারণ এটি ইঞ্জিনকে তার উপস্থাপনা পরিবর্তন করতে বাধ্য করতে পারে।

পরামর্শ

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

আপনি যদি সত্যই কোনও নির্দিষ্ট ইঞ্জিন (এবং সংস্করণ) এর জন্য অনুকূল করতে চান তবে পরম উত্তরের জন্য এটি উত্সকোডটি পরীক্ষা করে দেখুন ।


এক সেকেন্ড অপেক্ষা করুন, আমরা মিশ্র ডেটাটাইপগুলির সাথে অ্যারে রাখতে পারি? জাভাস্ক্রিপ্ট এত সুন্দর!
অনুরাগ

@ আনুরাগ হুবহু, তবে 99% ক্ষেত্রে আপনার এই বৈশিষ্ট্যটির প্রয়োজন হবে না
ডিজাইগনার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.