كما نعلم أن HashSet هي فئة مشهورة في Java. يتم استخدام HashSet لتخزين القيم باستخدام جدول التجزئة. في هذا البرنامج التعليمي، سوف نقوم بتغطية HashSet في بايثون. سنتعلم أيضًا كيف يمكننا تصميم HashSet في بايثون.
HashSet هي بنية بيانات أساسية في البرمجة، وهي موجودة عادة في لغات مثل Java. إنه ينتمي إلى Java Collections Framework ويعمل بمثابة تطبيق للواجهة المحددة. السمة المميزة لـ HashSet هي قدرتها على تخزين العناصر بطريقة تسهل التحقق الفعال من وجود عناصر محددة وتضمن التفرد داخل المجموعة. على عكس الهياكل مثل القوائم، لا تحافظ HashSet على أي ترتيب محدد بين عناصرها.
إحدى الخصائص الرئيسية لمجموعة HashSet هي ضمان التفرد؛ لا يسمح بالعناصر المكررة. عادةً ما تتمتع عمليات مثل إضافة العناصر وإزالتها والتحقق من وجودها بمتوسط أداء ثابت في الوقت المناسب، مما يجعلها خيارًا فعالاً لمثل هذه المهام. ومع ذلك، من الضروري ملاحظة أن ترتيب العناصر في HashSet غير مضمون.
الخصائص الرئيسية:
التفرد: لا يسمح HashSet بالعناصر المكررة. يستخدم طريقة يساوي () للتحقق من التكرارات، مما يضمن أن كل عنصر في المجموعة فريد من نوعه.
لا طلب: لا يتم تخزين العناصر الموجودة في HashSet بأي ترتيب معين. إذا كنت بحاجة إلى الحفاظ على ترتيب العناصر، فقد تفكر في استخدام LinkedHashSet، الذي يحافظ على ترتيب الإدراج.
هيكل البيانات الأساسي: داخليًا، تستخدم HashSet جدول تجزئة لتخزين العناصر. يتيح ذلك متوسط التعقيد في الوقت الثابت للعمليات الأساسية مثل الإضافة والإزالة والاحتواء.
العناصر الفارغة: تسمح HashSet بعنصر فارغ واحد. إذا حاولت إضافة عنصر فارغ مكرر، فسوف يحل محل العنصر الموجود.
مقدمة
يمكننا تصميم HashSet دون استخدام أي مكتبات لجداول التجزئة. وفيما يلي وظائف متعددة ومختلفة -
إضافة (خ) - تُستخدم طريقة add(x) بشكل أساسي لإدراج قيمة x في HashSet.
يحتوي على (x) - تُستخدم الطريقة التي تحتوي على (x) بشكل أساسي للتحقق مما إذا كانت القيمة x موجودة في HashSet أم لا.
إزالة (خ) - تُستخدم طريقة الإزالة (x) بشكل أساسي لحذف x من HashSet. إذا لم يكن لـ HashSet أي قيمة، فلن يفعل شيئًا.
تحتوي سلسلة جافا الفرعية على
دعونا نفهم هذه الأساليب من خلال المثال أدناه.
أولاً، قم بتهيئة وظيفة HashSet واستدعاء وظيفة add(1). سيضيف 1 إلى مجموعة التجزئة. استدعاء إضافة (3)، والتي ستضيف 3، ثم استدعاء يحتوي على (1). سوف يتحقق مما إذا كان الرقم 1 موجودًا أم لا في مجموعة التجزئة. الآن نسمي يحتوي على (2)، إضافة (2)، يحتوي على (2)، إزالة (2)، يحتوي على (2).
سيتم إرجاع الإخراج على النحو الصحيح إذا كان 1 موجودًا، أو خطأ إذا كان 2 غير موجود، أو صحيح إذا كان 2 موجودًا، أو خطأ إذا كان 2 غير موجود، على التوالي.
العمليات الأساسية لـ HashSet في بايثون
يمكننا إجراء بعض العمليات الأساسية في HashSet باستخدام الطرق التالية. دعونا نفهم هذه الأساليب.
إضافة قيم جديدة في HashSet
في المثال أدناه، سنقوم بإضافة القيمة في مجموعة التجزئة باستخدام وظيفة add(). تقوم الدالة add() بإضافة القيمة واحدة تلو الأخرى. دعونا نرى الكود التالي.
مثال -
from hs import HashSet obj = HashSet() obj.add(2) obj.add(7) obj.add(6)
انتاج:
Adding value: 2 Adding value: 7 Adding value: 6
إزالة القيم في HashSet
يمكننا إزالة القيمة الموجودة باستخدام وظيفة الإزالة (). دعونا نفهم الكود التالي.
مثال -
from hs import HashSet obj = HashSet() obj.add(2) obj.add(7) obj.add(6) obj.remove(7) obj.remove(6)
انتاج:
Adding value: 2 Adding value: 7 Adding value: 6 Removed value: 7 Removed value: 6
التحقق من وجود القيم في HashSet
في هذا المثال، سنوضح كيف يمكننا التحقق مما إذا كانت قيمة معينة موجودة أم لا تستخدم التابع يتضمن() وظيفة. دعونا نفهم الكود التالي.
مثال -
from hs import HashSet obj = HashSet() obj.add(2) obj.add(7) obj.add(6) obj.contains(2)
انتاج:
Adding value: 2 Adding value: 7 Adding value: 6 It contains: 2
خوارزمية HashSet في بايثون
في الخطوة الأولى، نحدد بنية بيانات واحدة تسمى HashList. ثم نقوم بتهيئة قائمة فارغة كـ قائمة_جديدة . بعد ذلك، نحدد وظيفة التحديث () التي سيتم فيها العثور على تخزين قيمة منطقية False. الآن، نستخدم حلقة for لكل مؤشر I وK. إذا كان المفتاح هو نفسه 'k'، إذن new_list[i]=k ووجدت قيمة مضبوطة على True. سيتم إدراج القيمة في آخر القائمة إذا لم يتم العثور على قيمة.
الخطوة التالية هي تحديد دالة get()، والتي سنستخدمها للحلقة، وإذا كانت قيمة k هي نفس قيمة المفتاح، فسيكون الناتج صحيحًا؛ وإلا فهو باطل. إذا كان المفتاح هو نفسه 'k'، فاحذف القيمة من القائمة قائمة جديدة. سيتم تطبيق نفس العملية في وظيفة الإزالة ().
الآن، سوف نقوم بإنشاء فئة HashSet الرئيسية. ستعلن هذه الفئة عن وظيفة التهيئة حيث تكون قيمة key_space = 2096. وسيحتوي جدول التجزئة على قائمة بكائنات نوع القائمة الجديدة ذات الحجم key_space . بعد ذلك، سوف نقوم بإنشاء وظيفة add()، والتي hash_key = key%key_space وتحديث مفتاح hash_table[hash_key]. بعد ذلك سوف نقوم بالاتصال على إزالة الوظيفة حيث hash_key = مفتاح % key_space، وحذف مفتاح hash_table[hash_key]. بعد ذلك سوف نقوم بالاتصال على يحتوي على وظيفة ، بحيث
hash_key = key % key_space، واحصل على مفتاح hash_table[hash_key].
دعونا نرى خوارزمية التنفيذ خطوة بخطوة.
الخوارزمية -
- قم بإنشاء بنية بيانات تسمى HashSet، وقم بتهيئتها كما هو موضح أدناه
- قائمة_جديدة = []
- تحديد تحديث الوظيفة (). هذا سوف يستغرق المفتاح
- وجدت := خطأ
- لكل فهرس i ومفتاح k في new_list، افعل ذلك
- إذا كان المفتاح هو نفسه k، إذن
- new_list[i]:= مفتاح
- وجدت: = صحيح
- يخرج من الحلقة
- إذا وجدت كاذبة، ثم
- أدخل المفتاح في نهاية new_list
- تحديد وظيفة get() . هذا سوف يستغرق المفتاح
- لكل k في new_list، افعل
- إذا كان k هو نفس المفتاح، إذن
- عودة صحيح
- عودة كاذبة
- تحديد وظيفة إزالة (). هذا سوف يستغرق المفتاح
- لكل فهرس i ومفتاح k في new_list، افعل ذلك
- إذا كان المفتاح هو نفسه k، إذن
- حذف new_list[i]
- الآن قم بإنشاء hashSet مخصص. سيكون هناك طرق قليلة على النحو التالي
- تهيئة هذا على النحو التالي -
- مفتاح_المسافة := 2096
- hash_table:= قائمة بكائنات نوع الجرافة بحجم key_space
- تحديد وظيفة إضافة (). هذا سوف يستغرق المفتاح
- hash_key:= مفتاح التعديل key_space
- استدعاء التحديث (المفتاح) لـ hash_table[hash_key]
- تحديد وظيفة إزالة (). هذا سوف يستغرق المفتاح
- hash_key:= keymodkey_space
- حذف المفتاح من hash_table[hash_key]
- تحديد وظيفة تحتوي على (). هذا سوف يستغرق المفتاح
- hash_key:= keymodkey_space
- إرجاع الحصول على (مفتاح) من hash_table[hash_key]
تنفيذ HashSet في بايثون
سنقوم هنا بتنفيذ الخوارزمية المذكورة أعلاه وإنشاء برنامج بايثون. سنحدد الفئتين: HashSet وCreateHashset. دعونا نرى الكود أدناه.
شفرة -
# Here, we are Designing the HashSet in python # Here, we are checking the values and will return the output class class verifyvalues: # Here, we are initialization function which has list new_list def __init__(self): self.new_list=[] # Here, we have the function to update values def update(self, key): found=False for i,k in enumerate(self.new_list): if key==k: self.new_list[i]=key found=True break if not found: self.new_list.append(key) # Here, we have function to get values def get(self, key): for k in self.new_list: if k==key: return True return False # Here, we have function to remove values def remove(self, key): for i,k in enumerate(self.new_list): if key==k: del self.new_list[i] # Here, we have defined a class as HashSet class HashSet: # Here, we have defined an Initialization function def __init__(self): self.key_space = 2096 self.hash_table=[verifyvalues() for i in range(self.key_space)] def hash_values(self, key): hash_key=key%self.key_space return hash_key # Here, we have also defined an add function def add(self, key): self.hash_table[self.hash_values(key)].update(key) # Here, we have also defined a remove function def remove(self, key): self.hash_table[self.hash_values(key)].remove(key) # Here, we have defined the contains function def contains(self, key): return self.hash_table[self.hash_values(key)].get(key) def display(self): ls=[] for i in self.hash_table: if len(i.new_list)!=0:ls.append(i.new_list[0]) print(ls) ob = HashSet() print(ob.hash_values(10)) print('Add 10') ob.add(10) print(ob.hash_values(6)) print('Add 6 ') ob.add(6) print(ob.hash_values(5)) print('Add 5 ') ob.add(5) print('Contains 10 : ',ob.contains(10)) print('Contains 3: ',ob.contains(3)) print('Contains 8 : ',ob.contains(9))
انتاج:
10 Add 10 6 Add 6 5 Add 5 Contains 10 : True Contains 3: False Contains 8 : False 2 Add 2 3 Add 3 Contains 2 : True Remove 2 Contains 2 : False Contains 3 : True [3, 5, 6, 10]
توضيح: