লিঙ্কযুক্ত তালিকা বনাম তালিকা ব্যবহার করা কখন ভাল ?
লিঙ্কযুক্ত তালিকা বনাম তালিকা ব্যবহার করা কখন ভাল ?
উত্তর:
এই উত্তর মন্তব্য দয়া করে পড়ুন। লোকেরা দাবি করে যে আমি সঠিক পরীক্ষা করিনি। আমি সম্মতি জানাই এটি কোনও গ্রহণযোগ্য উত্তর হওয়া উচিত নয়। আমি যখন শিখছিলাম তখন আমি কিছু পরীক্ষা করেছি এবং সেগুলি ভাগ করে নেওয়ার মতো অনুভব করেছি।
আমি আকর্ষণীয় ফলাফল পেয়েছি:
// Temporary class to show the example
class Temp
{
public decimal A, B, C, D;
public Temp(decimal a, decimal b, decimal c, decimal d)
{
A = a; B = b; C = c; D = d;
}
}
LinkedList<Temp> list = new LinkedList<Temp>();
for (var i = 0; i < 12345678; i++)
{
var a = new Temp(i, i, i, i);
list.AddLast(a);
}
decimal sum = 0;
foreach (var item in list)
sum += item.A;
List<Temp> list = new List<Temp>(); // 2.4 seconds
for (var i = 0; i < 12345678; i++)
{
var a = new Temp(i, i, i, i);
list.Add(a);
}
decimal sum = 0;
foreach (var item in list)
sum += item.A;
এমনকি যদি আপনি কেবলমাত্র ডেটা অ্যাক্সেস করেন তবে এটি অনেক ধীর হয় !! আমি বলি কখনও লিঙ্কযুক্ত তালিকা ব্যবহার করবেন না।
এখানে অনেকগুলি সন্নিবেশ করানো আরেকটি তুলনা করা হচ্ছে (আমরা তালিকার মাঝখানে একটি আইটেম সন্নিবেশ করার পরিকল্পনা করছি)
LinkedList<Temp> list = new LinkedList<Temp>();
for (var i = 0; i < 123456; i++)
{
var a = new Temp(i, i, i, i);
list.AddLast(a);
var curNode = list.First;
for (var k = 0; k < i/2; k++) // In order to insert a node at the middle of the list we need to find it
curNode = curNode.Next;
list.AddAfter(curNode, a); // Insert it after
}
decimal sum = 0;
foreach (var item in list)
sum += item.A;
List<Temp> list = new List<Temp>();
for (var i = 0; i < 123456; i++)
{
var a = new Temp(i, i, i, i);
list.Insert(i / 2, a);
}
decimal sum = 0;
foreach (var item in list)
sum += item.A;
list.AddLast(new Temp(1,1,1,1));
var referenceNode = list.First;
for (var i = 0; i < 123456; i++)
{
var a = new Temp(i, i, i, i);
list.AddLast(a);
list.AddBefore(referenceNode, a);
}
decimal sum = 0;
foreach (var item in list)
sum += item.A;
সুতরাং কেবলমাত্র যদি আপনি বেশ কয়েকটি আইটেম সন্নিবেশ করার পরিকল্পনা করেন এবং আপনারও কোথাও রেফারেন্স থাকে যেখানে আপনি আইটেমটি সন্নিবেশ করানোর পরিকল্পনা করছেন তারপরে একটি লিঙ্কযুক্ত তালিকা ব্যবহার করুন। কেবল আপনাকে প্রচুর আইটেম inোকাতে হবে এটি এটি দ্রুত করে না কারণ আপনি যেখানে সন্নিবেশ করতে চান সেখানে অনুসন্ধান করতে সময় লাগে।
list.AddLast(a);
শেষ দুটি লিঙ্কডলিস্টের উদাহরণগুলিতে ইন-লুপটি কেন ? আমি লুপের আগে একবার এটি list.AddLast(new Temp(1,1,1,1));
করছি, শেষ লিংকডলিস্টের পরের মতো, তবে এটি (আমার কাছে) দেখে মনে হচ্ছে আপনি নিজের লুপগুলিতে দ্বিগুণ টেম্পের বস্তু যুক্ত করছেন। (এবং আমি যখন কোনও পরীক্ষার অ্যাপ্লিকেশনটি দিয়ে নিজেকে ডাবল-চেক করি , তখন অবশ্যই লিঙ্কডলিস্টে দ্বিগুণ।)
I say never use a linkedList.
পরবর্তী পরামর্শটি প্রকাশিত হওয়ায় আপনার সাধারণ পরামর্শ ত্রুটিযুক্ত। আপনি এটি সম্পাদনা করতে চাইতে পারেন। 2) আপনি সময় কি? এক ধাপে পুরোপুরি ইনস্ট্যান্টেশন, সংযোজন এবং গণনা? বেশিরভাগ ক্ষেত্রে, ইনস্ট্যান্টেশন এবং গণনা পিপিএল সম্পর্কে চিন্তিত নয়, সেগুলি এক সময়ের পদক্ষেপ। বিশেষত সন্নিবেশ এবং সংযোজনগুলির সময় নির্ধারণ করা আরও ভাল ধারণা দেবে। 3) সর্বাধিক গুরুত্বপূর্ণ, আপনি একটি লিঙ্কলিস্টে প্রয়োজনের চেয়ে বেশি যোগ করছেন। এটি একটি ভুল তুলনা। লিঙ্কলিস্ট সম্পর্কে ভুল ধারণা ছড়িয়ে দেয়।
বেশিরভাগ ক্ষেত্রে, List<T>
আরও দরকারী। LinkedList<T>
তালিকার মাঝখানে আইটেমগুলি যুক্ত / অপসারণ করার সময় কম ব্যয় হবে, তবে List<T>
কেবলমাত্র শেষে সস্তাভাবে যোগ / অপসারণ করা যাবে তালিকাটির ।
LinkedList<T>
কেবলমাত্র সর্বাধিক দক্ষ যদি আপনি সিক্যুয়াল ডেটা অ্যাক্সেস করে থাকেন (তবে সামনে বা পিছনের দিকে) - এলোমেলো অ্যাক্সেস তুলনামূলকভাবে ব্যয়বহুল কারণ এটি প্রতিবার শৃঙ্খলে চলতে হবে (সুতরাং কেন এটির সূচক নেই)। তবে, কারণ কList<T>
মূলত কেবল একটি অ্যারে (মোড়কযুক্ত) এলোমেলো অ্যাক্সেস ভাল।
List<T>
এছাড়াও সমর্থন পদ্ধতির অনেক প্রস্তাব - Find
, ToArray
ইত্যাদি; যাইহোক, এগুলি LinkedList<T>
এক্সটেনশন পদ্ধতিগুলির মাধ্যমে .NET 3.5 / C # 3.0 এর জন্যও উপলব্ধ - যাতে এটি কোনও কারণের চেয়ে কম হয়।
List<T>
এবং T[]
খুব চঞ্চল হওয়ার জন্য ব্যর্থ হবে (সমস্ত এক স্ল্যাব), LinkedList<T>
খুব দানাদার হওয়ার জন্য বিলাপ করবে (উপাদান প্রতি স্ল্যাব)।
লিঙ্কযুক্ত তালিকাকে তালিকা হিসাবে ভাবা কিছুটা বিভ্রান্তিকর হতে পারে। এটি আরও একটি চেইনের মতো। প্রকৃতপক্ষে। নেট, LinkedList<T>
এমনকি বাস্তবায়ন করে নাIList<T>
। কোনও লিঙ্কযুক্ত তালিকায় সূচকের আসল ধারণা নেই, যদিও মনে হয় এটি রয়েছে। অবশ্যই শ্রেণিতে প্রদত্ত কোনও পদ্ধতিই সূচকগুলি গ্রহণ করে না।
লিঙ্কযুক্ত তালিকাগুলি এককভাবে সংযুক্ত, বা দ্বিগুণভাবে লিঙ্কযুক্ত হতে পারে। এটি শৃঙ্খলের প্রতিটি উপাদানগুলির কেবলমাত্র পরবর্তী পরবর্তীগুলির সাথে (এককভাবে সংযুক্ত) বা পূর্ববর্তী / পরবর্তী উভয় উপাদানগুলির (দ্বিগুণ সংযুক্ত) উভয়টির লিঙ্ক রয়েছে কিনা তা বোঝায়। LinkedList<T>
দ্বিগুণভাবে লিঙ্কযুক্ত।
অভ্যন্তরীণভাবে, List<T>
একটি অ্যারে দ্বারা সমর্থিত। এটি মেমরিতে একটি খুব কমপ্যাক্ট উপস্থাপনা সরবরাহ করে। বিপরীতে, LinkedList<T>
ধারাবাহিক উপাদানগুলির মধ্যে দ্বি-নির্দেশমূলক লিঙ্কগুলি সঞ্চয় করতে অতিরিক্ত মেমরি জড়িত। সুতরাং LinkedList<T>
সাধারণত উইলের মেমরির পদচিহ্নগুলি এর চেয়ে বড় হবে List<T>
(ক্যাভেটের সাথে অ্যাপেন্ড List<T>
অপারেশনের সময় কার্যকারিতা উন্নত করতে অব্যবহৃত অভ্যন্তরীণ অ্যারে উপাদান থাকতে পারে))
এগুলির পারফরম্যান্সের বৈশিষ্ট্যও রয়েছে:
LinkedList<T>.AddLast(item)
ধ্রুব সময়List<T>.Add(item)
নিয়মিত ধ্রুবক সময়, লিনিয়ার সবচেয়ে খারাপ ক্ষেত্রেLinkedList<T>.AddFirst(item)
ধ্রুব সময়List<T>.Insert(0, item)
রৈখিক সময়LinkedList<T>.AddBefore(node, item)
ধ্রুব সময়LinkedList<T>.AddAfter(node, item)
ধ্রুব সময়List<T>.Insert(index, item)
রৈখিক সময়LinkedList<T>.Remove(item)
রৈখিক সময়LinkedList<T>.Remove(node)
ধ্রুব সময়List<T>.Remove(item)
রৈখিক সময়List<T>.RemoveAt(index)
রৈখিক সময়LinkedList<T>.Count
ধ্রুব সময়List<T>.Count
ধ্রুব সময়LinkedList<T>.Contains(item)
রৈখিক সময়List<T>.Contains(item)
রৈখিক সময়LinkedList<T>.Clear()
রৈখিক সময়List<T>.Clear()
রৈখিক সময়আপনি দেখতে পাচ্ছেন যে এগুলি বেশিরভাগ সমতুল্য। অনুশীলনে, এর এপিআইLinkedList<T>
করা আরও জটিল এবং এর অভ্যন্তরীণ প্রয়োজনীয়তার বিবরণগুলি আপনার কোডের মধ্যে ছড়িয়ে পড়ে।
তবে, যদি আপনাকে তালিকার মধ্যে থেকে অনেকগুলি সন্নিবেশ / অপসারণের প্রয়োজন হয় তবে এটি স্থির সময় দেয় offers List<T>
রৈখিক সময় সরবরাহ করে, তালিকার অতিরিক্ত আইটেমগুলি সন্নিবেশ / অপসারণের পরে প্রায় পরিবর্তন করা উচিত।
লিঙ্কযুক্ত তালিকাগুলি খুব দ্রুত সন্নিবেশ বা তালিকার সদস্যের মোছার ব্যবস্থা করে। লিঙ্কযুক্ত তালিকার প্রতিটি সদস্যের তালিকায় পরবর্তী সদস্যের জন্য একটি পয়েন্টার থাকে যাতে আমি অবস্থানটিতে সদস্য সন্নিবেশ করতে পারি:
একটি লিঙ্কযুক্ত তালিকার অসুবিধাটি এলোমেলো অ্যাক্সেস সম্ভব নয়। কোনও সদস্য অ্যাক্সেসের জন্য কাঙ্ক্ষিত সদস্য না পাওয়া পর্যন্ত তালিকাটি ট্র্যাভার করা দরকার।
আমার আগের উত্তরটি যথেষ্ট সঠিক ছিল না। সত্যই এটি ভয়ঙ্কর ছিল: ডি কিন্তু এখন আমি আরও অনেক দরকারী এবং সঠিক উত্তর পোস্ট করতে পারি।
আমি কিছু অতিরিক্ত পরীক্ষাও করেছি। আপনি নীচের লিঙ্কটি দ্বারা এটি উত্সটি খুঁজে পেতে পারেন এবং আপনার নিজের পরিবেশে এটি পুনরায় পরীক্ষা করুন: https://github.com/ukushu/DataStructuresTestsAndOther.git
সংক্ষিপ্ত ফলাফল:
অ্যারে ব্যবহার করা প্রয়োজন:
তালিকাটি ব্যবহারের প্রয়োজন:
লিঙ্কডলিস্ট ব্যবহার করা প্রয়োজন:
আরো বিস্তারিত:
LinkedList<T>
অভ্যন্তরীণ .NET- এ কোনও তালিকা নয়। এটি এমনকি বাস্তবায়ন করে না IList<T>
। এবং সে কারণেই অনুপস্থিত সূচীগুলি এবং সূচকগুলি সম্পর্কিত পদ্ধতি রয়েছে methods
LinkedList<T>
নোড-পয়েন্টার ভিত্তিক সংগ্রহ। .NET এ এটি দ্বিগুণ লিঙ্কযুক্ত বাস্তবায়নে রয়েছে। এর অর্থ পূর্বের / পরবর্তী উপাদানগুলির বর্তমান উপাদানের সাথে লিঙ্ক রয়েছে। এবং ডেটা খণ্ডিত - বিভিন্ন তালিকার অবজেক্টগুলি র্যামের বিভিন্ন স্থানে অবস্থিত হতে পারে। এছাড়াও এর LinkedList<T>
জন্য List<T>
বা অ্যারের চেয়ে বেশি মেমরি ব্যবহৃত হবে ।
List<T>
নেট। জাভা এর বিকল্প ArrayList<T>
। এর অর্থ এটি অ্যারে র্যাপার। সুতরাং এটি মেমরির জন্য ডেটা এক সংলগ্ন ব্লক হিসাবে বরাদ্দ করা হয়। যদি বরাদ্দ করা ডেটার আকার 85000 বাইটের বেশি হয়, তবে এটি বৃহত্তর অবজেক্ট হ্যাপে স্থানান্তরিত হবে। আকারের উপর নির্ভর করে এটি হ্যাপ ফ্র্যাগমেন্টেশন (মেমরি ফাঁসের একটি হালকা ফর্ম) হতে পারে। তবে একই সময়ে যদি আকার <85000 বাইট - এটি মেমরিতে একটি খুব কমপ্যাক্ট এবং দ্রুত অ্যাক্সেসের উপস্থাপনা সরবরাহ করে।
একক সংঘবদ্ধ ব্লকটি এলোমেলো অ্যাক্সেস কর্মক্ষমতা এবং মেমরির ব্যবহারের জন্য পছন্দ করা হয় তবে সংগ্রহগুলির জন্য যা নিয়মিত আকার পরিবর্তন করতে হবে যেমন অ্যারের মতো কাঠামোটি সাধারণত একটি নতুন স্থানে অনুলিপি করা প্রয়োজন যখন একটি লিঙ্কযুক্ত তালিকাকে কেবল সন্নিবেশ করা মেমরি পরিচালনা করতে হবে / মোছা নোড
তালিকা এবং লিংকডলিস্টের মধ্যে পার্থক্য তাদের অন্তর্নিহিত বাস্তবায়নের মধ্যে রয়েছে। তালিকাটি অ্যারে ভিত্তিক সংগ্রহ (অ্যারেলিস্ট)। লিংকডলিস্টটি নোড-পয়েন্টার ভিত্তিক সংগ্রহ (লিংকডলিস্টনোড)। আইপিএল স্তরের ব্যবহারের ক্ষেত্রে, উভয়ই একইরকম একই আইসোলিকেশন, আইইনুমেবল ইত্যাদি হিসাবে একই সেট ইন্টারফেস প্রয়োগ করে
মূল পার্থক্যটি আসে পারফরম্যান্সের ক্ষেত্রে। উদাহরণস্বরূপ, আপনি যদি ভারী "INSERT" অপারেশন রয়েছে সেই তালিকাটি যদি প্রয়োগ করে থাকেন তবে লিংকডলিস্টের বাইরে থাকা তালিকা। যেহেতু লিংকডলিস্ট এটি ও (1) সময়ে করতে পারে তবে তালিকাকে অন্তর্নিহিত অ্যারের আকার প্রসারিত করতে হতে পারে। আরও তথ্য / বিশদের জন্য আপনি লিঙ্কডলিস্ট এবং অ্যারের ডেটা স্ট্রাকচারের মধ্যে অ্যালগোরিদমিক পার্থক্যটি পড়তে চাইতে পারেন। http://en.wikedia.org/wiki/Linked_list এবং অ্যারে
আশা করি এই সহায়তা,
Add
সর্বদা বিদ্যমান অ্যারের শেষে থাকবেন সে বিষয়ে ভাবছেন । List
ও (1) না হলেও এটি "যথেষ্ট ভাল"। গুরুতর সমস্যা দেখা দেয় যদি অনেক প্রয়োজন Add
গুলি যে না শেষে। মার্ক ইঙ্গিত করছে যে প্রতিবার sertোকালে প্রতিবার বিদ্যমান ডেটা সরিয়ে নেওয়ার প্রয়োজন (কেবলমাত্র আকার পরিবর্তন করার সময় নয়) এর আরও বেশি পারফরম্যান্স ব্যয় । List
অ্যারেগুলিতে লিঙ্কযুক্ত তালিকার প্রাথমিক সুবিধা হ'ল লিঙ্কগুলি আইটেমগুলিকে দক্ষতার সাথে পুনর্বিন্যাসের সক্ষমতা সরবরাহ করে। সেডজউইক, পি। 91
লিংকডলিস্ট ব্যবহারের একটি সাধারণ পরিস্থিতি এরকম:
ধরুন আপনি বড় আকারের স্ট্রিংয়ের তালিকা থেকে অনেকগুলি নির্দিষ্ট স্ট্রিং সরিয়ে ফেলতে চান, 100,000 বলুন। মুছে ফেলার স্ট্রিংগুলি হ্যাশসেট ডিকগুলিতে দেখা যাবে এবং বিশ্বাস করা হয় যে স্ট্রিংগুলির তালিকা অপসারণ করতে 30,000 থেকে 60,000 এর মধ্যে স্ট্রিং রয়েছে।
তাহলে 100,000 স্ট্রিংস স্টোর করার জন্য সেরা ধরণের তালিকার কী? উত্তরটি লিংকডলিস্ট। যদি সেগুলি একটি অ্যারেলিস্টে সঞ্চিত থাকে, তবে এটির উপরে পুনরাবৃত্তি হবে এবং মিলিত স্ট্রিংগুলি অপসারণ করতে বিলিয়ন অপারেশন পর্যন্ত নিতে হবে, যখন এটির পুনরুক্তিকারী এবং অপসারণ পদ্ধতি ব্যবহার করে প্রায় 100,000 অপারেশন লাগে।
LinkedList<String> strings = readStrings();
HashSet<String> dic = readDic();
Iterator<String> iterator = strings.iterator();
while (iterator.hasNext()){
String string = iterator.next();
if (dic.contains(string))
iterator.remove();
}
RemoveAll
ফেলে আইটেমগুলি সরিয়ে ফেলতে List
বা Where
দ্বিতীয় তালিকা তৈরি করতে লিনকিউ থেকে ব্যবহার করতে পারেন। LinkedList
এখানে একটি ব্যবহারের মাধ্যমে অন্য ধরণের সংগ্রহের চেয়ে নাটকীয়ভাবে বেশি মেমরি গ্রাস করা শেষ হয় এবং মেমরির লোকাল হারিয়ে যাওয়ার অর্থ এটি পুনরাবৃত্তিতে উল্লেখযোগ্যভাবে ধীর হবে, এটি এটির চেয়ে বেশ খানিকটা খারাপ করে তোলে List
।
RemoveAll
জাভাতে কোনও সমতুল্য আছে কিনা ।
RemoveAll
জন্য উপলভ্য না থাকে তবে List
আপনি "সংক্ষেপণ" অ্যালগরিদম করতে পারেন যা টমের লুপের মতো দেখাবে, তবে দুটি সূচক এবং আইটেমগুলি একবারে তালিকার অভ্যন্তরীণ অ্যারেতে রাখার প্রয়োজন সহ। দক্ষতা হ'ল ও (এন), টমের অ্যালগরিদমের মতো LinkedList
। উভয় সংস্করণে স্ট্রিংগুলির জন্য হ্যাশসেট কী গণনার সময়। কখন ব্যবহার করবেন এটির একটি ভাল উদাহরণ নয় LinkedList
।
আপনার যখন অন্তর্নির্মিত ইনডেক্স অ্যাক্সেস, বাছাইকরণ (এবং এই বাইনারি অনুসন্ধানের পরে) এবং "টোআররে ()" পদ্ধতির দরকার হলে আপনার তালিকা ব্যবহার করা উচিত।
মূলত, একটি List<>
ইন। নেট একটি অ্যারের উপরে একটি মোড়ক । এ LinkedList<>
লিঙ্কযুক্ত তালিকা । সুতরাং প্রশ্নটি নেমে আসে, একটি অ্যারে এবং একটি লিঙ্কযুক্ত তালিকার মধ্যে পার্থক্য কী এবং কোনও লিঙ্কযুক্ত তালিকার পরিবর্তে কখন অ্যারে ব্যবহার করা উচিত। সম্ভবত কোনটি ব্যবহার করবেন সে সম্পর্কে আপনার সিদ্ধান্তের সবচেয়ে গুরুত্বপূর্ণ দুটি কারণগুলি নেমে আসবে:
এটি টোনো নাম এর গৃহীত উত্তর থেকে এর মধ্যে কয়েকটি ভুল পরিমাপ সংশোধন করে অভিযোজিত ।
পরীক্ষা:
static void Main()
{
LinkedListPerformance.AddFirst_List(); // 12028 ms
LinkedListPerformance.AddFirst_LinkedList(); // 33 ms
LinkedListPerformance.AddLast_List(); // 33 ms
LinkedListPerformance.AddLast_LinkedList(); // 32 ms
LinkedListPerformance.Enumerate_List(); // 1.08 ms
LinkedListPerformance.Enumerate_LinkedList(); // 3.4 ms
//I tried below as fun exercise - not very meaningful, see code
//sort of equivalent to insertion when having the reference to middle node
LinkedListPerformance.AddMiddle_List(); // 5724 ms
LinkedListPerformance.AddMiddle_LinkedList1(); // 36 ms
LinkedListPerformance.AddMiddle_LinkedList2(); // 32 ms
LinkedListPerformance.AddMiddle_LinkedList3(); // 454 ms
Environment.Exit(-1);
}
এবং কোড:
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
namespace stackoverflow
{
static class LinkedListPerformance
{
class Temp
{
public decimal A, B, C, D;
public Temp(decimal a, decimal b, decimal c, decimal d)
{
A = a; B = b; C = c; D = d;
}
}
static readonly int start = 0;
static readonly int end = 123456;
static readonly IEnumerable<Temp> query = Enumerable.Range(start, end - start).Select(temp);
static Temp temp(int i)
{
return new Temp(i, i, i, i);
}
static void StopAndPrint(this Stopwatch watch)
{
watch.Stop();
Console.WriteLine(watch.Elapsed.TotalMilliseconds);
}
public static void AddFirst_List()
{
var list = new List<Temp>();
var watch = Stopwatch.StartNew();
for (var i = start; i < end; i++)
list.Insert(0, temp(i));
watch.StopAndPrint();
}
public static void AddFirst_LinkedList()
{
var list = new LinkedList<Temp>();
var watch = Stopwatch.StartNew();
for (int i = start; i < end; i++)
list.AddFirst(temp(i));
watch.StopAndPrint();
}
public static void AddLast_List()
{
var list = new List<Temp>();
var watch = Stopwatch.StartNew();
for (var i = start; i < end; i++)
list.Add(temp(i));
watch.StopAndPrint();
}
public static void AddLast_LinkedList()
{
var list = new LinkedList<Temp>();
var watch = Stopwatch.StartNew();
for (int i = start; i < end; i++)
list.AddLast(temp(i));
watch.StopAndPrint();
}
public static void Enumerate_List()
{
var list = new List<Temp>(query);
var watch = Stopwatch.StartNew();
foreach (var item in list)
{
}
watch.StopAndPrint();
}
public static void Enumerate_LinkedList()
{
var list = new LinkedList<Temp>(query);
var watch = Stopwatch.StartNew();
foreach (var item in list)
{
}
watch.StopAndPrint();
}
//for the fun of it, I tried to time inserting to the middle of
//linked list - this is by no means a realistic scenario! or may be
//these make sense if you assume you have the reference to middle node
//insertion to the middle of list
public static void AddMiddle_List()
{
var list = new List<Temp>();
var watch = Stopwatch.StartNew();
for (var i = start; i < end; i++)
list.Insert(list.Count / 2, temp(i));
watch.StopAndPrint();
}
//insertion in linked list in such a fashion that
//it has the same effect as inserting into the middle of list
public static void AddMiddle_LinkedList1()
{
var list = new LinkedList<Temp>();
var watch = Stopwatch.StartNew();
LinkedListNode<Temp> evenNode = null, oddNode = null;
for (int i = start; i < end; i++)
{
if (list.Count == 0)
oddNode = evenNode = list.AddLast(temp(i));
else
if (list.Count % 2 == 1)
oddNode = list.AddBefore(evenNode, temp(i));
else
evenNode = list.AddAfter(oddNode, temp(i));
}
watch.StopAndPrint();
}
//another hacky way
public static void AddMiddle_LinkedList2()
{
var list = new LinkedList<Temp>();
var watch = Stopwatch.StartNew();
for (var i = start + 1; i < end; i += 2)
list.AddLast(temp(i));
for (int i = end - 2; i >= 0; i -= 2)
list.AddLast(temp(i));
watch.StopAndPrint();
}
//OP's original more sensible approach, but I tried to filter out
//the intermediate iteration cost in finding the middle node.
public static void AddMiddle_LinkedList3()
{
var list = new LinkedList<Temp>();
var watch = Stopwatch.StartNew();
for (var i = start; i < end; i++)
{
if (list.Count == 0)
list.AddLast(temp(i));
else
{
watch.Stop();
var curNode = list.First;
for (var j = 0; j < list.Count / 2; j++)
curNode = curNode.Next;
watch.Start();
list.AddBefore(curNode, temp(i));
}
}
watch.StopAndPrint();
}
}
}
অন্যরা এখানে নথিভুক্ত করেছেন তাত্ত্বিক পারফরম্যান্স অনুসারে আপনি ফলাফলগুলি দেখতে পাচ্ছেন। বেশ পরিষ্কার - LinkedList<T>
সন্নিবেশ ক্ষেত্রে বড় সময় লাভ। আমি তালিকার মাঝ থেকে অপসারণের জন্য পরীক্ষা করিনি, তবে ফলাফলটি একই হওয়া উচিত। অবশ্যই List<T>
অন্যান্য ক্ষেত্র রয়েছে যেখানে এটি হে (1) এলোমেলো অ্যাক্সেসের মতো আরও ভালভাবে কার্য সম্পাদন করে।
LinkedList<>
যখন ব্যবহার করুন
Token Stream
,।অন্য কিছুর জন্য, এটি ব্যবহার করা ভাল List<>
।
LinkedListNode<T>
আপনার কোডের অবজেক্টগুলিকে ট্র্যাক করে রাখেন তবে সন্নিবেশ / মুছার জন্য আপনাকে তালিকাটি স্ক্যান করতে হবে না। যদি আপনি এটি করতে পারেন, তবে এটি ব্যবহারের চেয়ে অনেক বেশি ভাল List<T>
, বিশেষত খুব দীর্ঘ তালিকার জন্য যেখানে সন্নিবেশ / অপসারণ ঘন ঘন থাকে।
node.Value
আপনি যখনই মূল উপাদানটি চান তখন ব্যবহার করুন )। সুতরাং আপনি নোডগুলির সাথে কাজ করতে অ্যালগরিদমটি পুনরায় লেখেন, কাঁচা মানগুলি নয়।
আমি উপরোক্ত বেশিরভাগ পয়েন্টের সাথে একমত নই। এবং আমি এটিও সম্মত করি যে বেশিরভাগ ক্ষেত্রে তালিকা আরও সুস্পষ্ট পছন্দ বলে মনে হচ্ছে।
তবে, আমি কেবল যুক্ত করতে চাই যে এমন অনেকগুলি উদাহরণ রয়েছে যেখানে লিংকডলিস্ট আরও ভাল দক্ষতার জন্য তালিকার চেয়ে আরও ভাল পছন্দ।
আশা করি যে কেউ এই মন্তব্যগুলি দরকারী হবে।
এখানে অনেক গড় উত্তর ...
কিছু লিঙ্কযুক্ত তালিকা বাস্তবায়ন পূর্ব বরাদ্দ নোডের অন্তর্নিহিত ব্লক ব্যবহার করে। যদি তারা ধ্রুবক সময় / লিনিয়ার সময়ের চেয়ে এটি না করে তবে মেমরির কার্য সম্পাদন খারাপ হবে এবং ক্যাশের কার্যকারিতা আরও খারাপ হবে।
লিঙ্কযুক্ত তালিকাগুলি ব্যবহার করুন
1) আপনি থ্রেড সুরক্ষা চান। আপনি আরও ভাল থ্রেড নিরাপদ আলগোস তৈরি করতে পারেন। লকিং ব্যয় একটি সমবর্তী শৈলীর তালিকায় প্রভাব ফেলবে।
2) আপনার যদি স্ট্রাকচারের মতো একটি বৃহত্তর সারি থাকে এবং আপনি মুছে ফেলতে বা যে কোনও জায়গায় যুক্ত করতে চান তবে শেষ সময়টি। > 100 কে তালিকাগুলি বিদ্যমান তবে সাধারণ নয়।
আমি লিংকডলিস্ট সংগ্রহের কার্য সম্পাদন সম্পর্কিত অনুরূপ একটি প্রশ্ন জিজ্ঞাসা করেছি এবং আবিষ্কার করেছিলেন স্টিভেন ক্লিয়ারির সি # ডেকের বাস্তবায়ন একটি সমাধান ছিল। সারি সংগ্রহের মতো নয়, ডেক সামনের আইটেমগুলি সামনে এবং পিছনে চালিয়ে যাওয়ার অনুমতি দেয়। এটি লিঙ্কযুক্ত তালিকার মতো তবে উন্নত কর্মক্ষমতা সহ।
Deque
হয় "যুক্ত তালিকা অনুরূপ, কিন্তু উন্নত পারফরম্যান্সের সঙ্গে" । যে বিবৃতি যোগ্যতা অর্জন করুন: Deque
বেশি ভালো কার্য সম্পাদন হয় LinkedList
, আপনার নির্দিষ্ট কোডের জন্য । আপনার লিঙ্কটি অনুসরণ করে, আমি দেখতে পাচ্ছি যে দুদিন পরে আপনি ইভান স্টয়েভের কাছ থেকে জানতে পেরেছেন যে এটি লিংকডলিস্টের অদক্ষতা নয়, তবে আপনার কোডের অদক্ষতা। ; (শুধুমাত্র নির্দিষ্ট ক্ষেত্রেই এমনকি যদি এটা LinkedList একজন অদক্ষতা ছিল, যে একটি সাধারণ বিবৃতি যে Deque অধিক দক্ষ হয় ধার্মিক প্রতিপন্ন করবেন না।)