স্কেলে অ্যারে এবং তালিকার মধ্যে পার্থক্য


142

কোন ক্ষেত্রে আমার অ্যারে (বাফার) এবং তালিকা (বাফার) ব্যবহার করা উচিত। কেবলমাত্র একটি পার্থক্য যা আমি জানি তা হ'ল অ্যারেগুলি অবিভক্ত এবং তালিকাগুলি কোভেরিয়েন্ট। তবে পারফরম্যান্স এবং অন্যান্য কিছু বৈশিষ্ট্য সম্পর্কে কী বলা যায়?

উত্তর:


155

অপরিবর্তনীয় কাঠামো

Scala List, একটি অপরিবর্তনীয় রিকার্সিভ ডাটা স্ট্রাকচার যা Scala এ ধরনের একটি মৌলিক কাঠামো যে আপনি উচিত (সম্ভবত) একটি চেয়ে অনেক বেশী এটা ব্যবহার করা Array(যা আসলে চপল - অপরিবর্তনীয় এনালগ এর Arrayহয় IndexedSeq)।

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

পরিবর্তনীয় কাঠামো

ListBufferএকটি ধ্রুবক-সময় রূপান্তর সরবরাহ করে Listযা এর ListBufferপরে যদি রূপান্তর প্রয়োজন হয় তবে তা ব্যবহারের একা কারণ ।

একটি স্কেল ArrayJVM এ জাভা অ্যারের দ্বারা প্রয়োগ করা উচিত, এবং সুতরাং এটির চেয়ে একটি Array[Int]আরও অনেক বেশি পারফরম্যান্ট হতে পারে (যা এর বিষয়বস্তুগুলিকে বক্স করবে, যদি না আপনি নতুন বৈশিষ্ট্যযুক্ত স্কালার অতি সাম্প্রতিক সংস্করণ ব্যবহার না করেন ) ।int[]List[Int]@specialized

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


আরো দেখুন stackoverflow.com/questions/3213368/... এবং stackoverflow.com/questions/2481149/... "সমান" এর সংজ্ঞা জন্য অ্যারেগুলির যে তারা একই অ্যারে পড়ুন হয়
oluies

130

ইতিমধ্যে পোস্ট করা উত্তরগুলি ছাড়াও, এখানে কিছু সুনির্দিষ্ট।

Array[A]আক্ষরিক অর্থে একটি জাভা অ্যারে থাকাকালীন , একটি List[A]হ'ল এক অবিচ্ছেদ্য ডেটা স্ট্রাকচার যা হয় Nil(খালি তালিকা) হয় বা একটি জুড়ি থাকে (A, List[A])

পারফরম্যান্স পার্থক্য

                          Array  List
Access the ith element    θ(1)   θ(i)
Delete the ith element    θ(n)   θ(i)
Insert an element at i    θ(n)   θ(i)
Reverse                   θ(n)   θ(n)
Concatenate (length m,n)  θ(n+m) θ(n)
Count the elements        θ(1)   θ(n)

মেমরির পার্থক্য

                          Array  List
Get the first i elements  θ(i)   θ(i)
Drop the first i elements θ(n-i) θ(1)
Insert an element at i    θ(n)   θ(i)
Reverse                   θ(n)   θ(n)
Concatenate (length m,n)  θ(n+m) θ(n)

সুতরাং আপনার যদি দ্রুত এলোমেলো অ্যাক্সেসের প্রয়োজন না হয়, উপাদানগুলি গণনা করা প্রয়োজন বা কোনও কারণে আপনার ধ্বংসাত্মক আপডেটের প্রয়োজন হয় না, Listএটি একটির চেয়ে ভাল Array


এই ওসগুলি কি তালিকাটি অনুলিপি করার জন্য সময় বিবেচনা করতে হবে? আমি অনুমান আপনি ভালো পরীক্ষা করছ, যেমন: list = list.drop(i)। বা, হুডের পিছনে কিছু জাদু দেখা দেয়?

2
এটি যখন প্রয়োজন হয় তখন অনুলিপি তালিকা এবং অ্যারেগুলিকে বিবেচনা করে। মনে রাখবেন যে জিনিসগুলি dropকখনও বাদ পড়ে না এমন তালিকার অংশটি অনুলিপি করার দরকার নেই। যেমন (x::xs).drop(1)ঠিক xs, না একটি এর "কপি করো" xs
অ্যাপোক্যালিস্প

6
এই অ্যাসিম্পটোটিকগুলির স্কালার সাথে কোনও সম্পর্ক নেই। সিতে একই ডেটা স্ট্রাকচার ধ্রুবক কারণগুলির ঠিক তত দ্রুত হবে।
অ্যাপোক্যালিস্প

1
@ অ্যাপোকালিস্প আপনার কাছে কোন রেফারেন্স রয়েছে বা কোন পরিস্থিতিতে আপনি এই তথ্যটি নির্ধারণ করেছেন?
ফিল

1
@ ফিল এগুলি এসেম্পটিকস, পরিমাপ নয়। তারা সব শর্তে সত্য রাখা হবে।
অ্যাপোক্যালিস্প

18

একটি অ্যারে পরিবর্তনীয়, যার অর্থ আপনি প্রতিটি সূচকের মান পরিবর্তন করতে পারবেন, যখন একটি তালিকা (ডিফল্টরূপে) অপরিবর্তনীয়, এর অর্থ হ'ল প্রতিবার আপনি কোনও পরিবর্তন করার পরে একটি নতুন তালিকা তৈরি করা হয়। বেশীর ভাগ ক্ষেত্রে এর অপরিবর্তনীয় datatypes সাথে কাজ করার অনুমোদন আরো "কার্মিক" শৈলী এবং আপনি সম্ভবত চেষ্টা করুন এবং মত নির্মান সঙ্গে একটি তালিকা ব্যবহার করা উচিত yield, foreach, matchএবং তাই ঘোষণা।

কর্মক্ষমতা বৈশিষ্ট্যগুলির জন্য, অ্যারের উপাদানগুলিতে এলোমেলো অ্যাক্সেস সহ দ্রুত হয়, অন্যদিকে নতুন উপাদানগুলি প্রিপেন্ডিং (যুক্ত) করার সময় একটি তালিকা দ্রুত হয়। তাদের উপর আইট্রেট করা তুলনামূলক।


@ লেওনম - অ্যাপলস, আমি ভেবেছিলাম যে ওপি একচেটিয়াভাবে * বাফার ক্লাস সম্পর্কে জিজ্ঞাসা করছে, আমি বুঝতে পারি যে তারা "সাধারণ" সম্পর্কেও জিজ্ঞাসা করছে!
অক্সবো_লাক্স

2
তালিকার জন্য একটি পূর্বে (বা তালিকার একটি উপাদান যুক্ত করার চেয়ে) অ্যারে বাফারের সাথে যুক্ত হওয়া দ্রুততর হয় কারণ তালিকাতে একটি মোড়কের বস্তু তৈরি করা প্রয়োজন যখন অ্যারেবফারকে কেবলমাত্র নতুন অ্যারেতে অবজেক্টটি (প্রায় দ্বিগুণ) অনুলিপি করতে হবে to । দুটি কপি সাধারণত একটি অবজেক্ট তৈরির চেয়ে দ্রুত হয়, সুতরাং অ্যারেবফার সংযোজন সাধারণত তালিকা প্রিপেন্ডকে প্রহার করে।
রেক্স কের

অ্যারে তালিকার চেয়ে অনেক দ্রুত সঞ্চালিত হয় যখন iterate overক্যাশের কারণে
বিন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.