এটি আপনার প্রশ্নের ঠিক উত্তর নয়, তবে আমার একটি ক্লাস রয়েছে যা একটি সংকলনে কনটেনস () এর কার্যকারিতা বাড়িয়ে তোলে। আমি একটি সারি সাবক্লাস করেছি এবং একটি অভিধান যুক্ত করেছি যা বস্তুর তালিকায় হ্যাশকোড ম্যাপ করে। Dictionary.Contains()
ফাংশন হে (1) যেহেতু List.Contains()
, Queue.Contains()
এবং Stack.Contains()
হে (ঢ) হয়।
অভিধানের মান-প্রকার হ'ল একই হ্যাশকোডযুক্ত একটি সারি ধারণ করে objects কলকারী একটি কাস্টম শ্রেণীর অবজেক্ট সরবরাহ করতে পারে যা আইকুয়ালিটি কম্পিউটারের প্রয়োগ করে। আপনি স্ট্যাকস বা তালিকার জন্য এই প্যাটার্নটি ব্যবহার করতে পারেন। কোডটির জন্য কেবল কয়েকটি পরিবর্তন প্রয়োজন।
private class HashQueue<T> : Queue<T>
{
private readonly IEqualityComparer<T> _comp;
public readonly Dictionary<int, Queue<T>> _hashes;
public HashQueue(IEqualityComparer<T> comp = null) : base()
{
this._comp = comp;
this._hashes = new Dictionary<int, Queue<T>>();
}
public HashQueue(int capacity, IEqualityComparer<T> comp = null) : base(capacity)
{
this._comp = comp;
this._hashes = new Dictionary<int, Queue<T>>(capacity);
}
public HashQueue(IEnumerable<T> collection, IEqualityComparer<T> comp = null) : base(collection)
{
this._comp = comp;
this._hashes = new Dictionary<int, Queue<T>>(base.Count);
foreach (var item in collection)
{
this.EnqueueDictionary(item);
}
}
public new void Enqueue(T item)
{
base.Enqueue(item);
this.EnqueueDictionary(item);
}
private void EnqueueDictionary(T item)
{
int hash = this._comp == null ? item.GetHashCode() : this._comp.GetHashCode(item);
Queue<T> temp;
if (!this._hashes.TryGetValue(hash, out temp))
{
temp = new Queue<T>();
this._hashes.Add(hash, temp);
}
temp.Enqueue(item);
}
public new T Dequeue()
{
T result = base.Dequeue();
int hash = this._comp == null ? result.GetHashCode() : this._comp.GetHashCode(result);
Queue<T> temp;
if (this._hashes.TryGetValue(hash, out temp))
{
temp.Dequeue();
if (temp.Count == 0)
this._hashes.Remove(hash);
}
return result;
}
public new bool Contains(T item)
{
int hash = this._comp == null ? item.GetHashCode() : this._comp.GetHashCode(item);
return this._hashes.ContainsKey(hash);
}
public new void Clear()
{
foreach (var item in this._hashes.Values)
item.Clear();
this._hashes.Clear();
base.Clear();
}
}
আমার সহজ পরীক্ষামূলক শো যে আমার HashQueue.Contains()
চেয়ে অনেক দ্রুত রান Queue.Contains()
। 10,000 এ গণনা সহ পরীক্ষার কোডটি চালাতে হাশকিউ সংস্করণটির জন্য 0.00045 সেকেন্ড এবং ক্যু সংস্করণের জন্য 0.37 সেকেন্ড সময় লাগে। ১০,০০,০০০ গণনা সহ, হাশকিউ সংস্করণটি 0.0031 সেকেন্ড সময় নেয় যখন কাতারে লাগে 36.38 সেকেন্ড!
আমার পরীক্ষার কোডটি এখানে:
static void Main(string[] args)
{
int count = 10000;
{
var q = new HashQueue<int>(count);
for (int i = 0; i < count; i++)
q.Enqueue(i);
System.Diagnostics.Stopwatch sw = System.Diagnostics.Stopwatch.StartNew();
for (int i = 0; i < count; i++)
{
bool contains = q.Contains(i);
}
sw.Stop();
Console.WriteLine(string.Format("HashQueue, {0}", sw.Elapsed));
}
{
var q = new Queue<int>(count);
for (int i = 0; i < count; i++)
q.Enqueue(i);
System.Diagnostics.Stopwatch sw = System.Diagnostics.Stopwatch.StartNew();
for (int i = 0; i < count; i++)
{
bool contains = q.Contains(i);
}
sw.Stop();
Console.WriteLine(string.Format("Queue, {0}", sw.Elapsed));
}
Console.ReadLine();
}