تسلسل Hashtables مع القوائم المرتبطة بشكل مضاعف

المتطلب السابق - مقدمة التجزئة Hashtable باستخدام قائمة مرتبطة منفردة & تنفيذ جدول التجزئة الخاص بنا مع تسلسل منفصل في Java يشبه تنفيذ جدول التجزئة باستخدام التسلسل من خلال القائمة المرتبطة بشكل مزدوج التنفيذ Hashtable باستخدام قائمة مرتبطة منفردة . والفرق الوحيد هو أن كل عقدة في القائمة المرتبطة لها عنوان العقدة التالية والسابقة. سيؤدي هذا إلى تسريع عملية إضافة وإزالة العناصر من القائمة وبالتالي سيتم تقليل تعقيد الوقت بشكل كبير. 

مثال:

إذا كان لدينا قائمة مرتبطة منفردة:

1->2->3->4 

إذا كنا في 3 وكانت هناك حاجة لإزالتها، فيجب ربط 2 بـ 4 ومن 3 2 لا يمكن الوصول إليها لأنها قائمة مرتبطة بشكل فردي. لذلك يجب اجتياز القائمة مرة أخرى، أي O(n) ولكن إذا كان لدينا قائمة مرتبطة بشكل مضاعف، أي

1 <->2 <->3 <->4 

يمكن الوصول إلى 2 و 4 من 3 وبالتالي في O (1) يمكن إزالة 3.

وفيما يلي تنفيذ النهج المذكور أعلاه: 

C++
   // C++ implementation of Hashtable   // using doubly linked list   #include          using     namespace     std  ;   const     int     tablesize     =     25  ;   // declaration of node   struct     hash_node     {      int     val       key  ;      hash_node  *     next  ;      hash_node  *     prev  ;   };   // hashmap's declaration   class     HashMap     {   public  :      hash_node     **  hashtable       **  top  ;      // constructor      HashMap  ()      {      // create a empty hashtable      hashtable     =     new     hash_node  *  [  tablesize  ];      top     =     new     hash_node  *  [  tablesize  ];      for     (  int     i     =     0  ;     i      <     tablesize  ;     i  ++  )     {      hashtable  [  i  ]     =     NULL  ;      top  [  i  ]     =     NULL  ;      }      }      // destructor      ~  HashMap  ()      {      delete  []     hashtable  ;      }      // hash function definition      int     HashFunc  (  int     key  )      {      return     key     %     tablesize  ;      }      // searching method      void     find  (  int     key  )      {      // Applying hashFunc to find      // index for given key      int     hash_val     =     HashFunc  (  key  );      bool     flag     =     false  ;      hash_node  *     entry     =     hashtable  [  hash_val  ];      // if hashtable at that index has some      // values stored      if     (  entry     !=     NULL  )     {      while     (  entry     !=     NULL  )     {      if     (  entry  ->  key     ==     key  )     {      flag     =     true  ;      }      if     (  flag  )     {      cout      < <     'Element found at key '       < <     key      < <     ': '  ;      cout      < <     entry  ->  val      < <     endl  ;      }      entry     =     entry  ->  next  ;      }      }      if     (  !  flag  )      cout      < <     'No Element found at key '       < <     key      < <     endl  ;      }      // removing an element      void     remove  (  int     key  )      {      // Applying hashFunc to find      // index for given key      int     hash_val     =     HashFunc  (  key  );      hash_node  *     entry     =     hashtable  [  hash_val  ];      if     (  entry  ->  key     !=     key     ||     entry     ==     NULL  )     {      cout      < <     'Couldn't find any element at this key '       < <     key      < <     endl  ;      return  ;      }      // if some values are present at that key &      // traversing the list and removing all values      while     (  entry     !=     NULL  )     {      if     (  entry  ->  next     ==     NULL  )     {      if     (  entry  ->  prev     ==     NULL  )     {      hashtable  [  hash_val  ]     =     NULL  ;      top  [  hash_val  ]     =     NULL  ;      delete     entry  ;      break  ;      }      else     {      top  [  hash_val  ]     =     entry  ->  prev  ;      top  [  hash_val  ]  ->  next     =     NULL  ;      delete     entry  ;      entry     =     top  [  hash_val  ];      }      }      entry     =     entry  ->  next  ;      }      cout      < <     'Element was successfully removed at the key '       < <     key      < <     endl  ;      }      // inserting method      void     add  (  int     key       int     value  )      {      // Applying hashFunc to find      // index for given key      int     hash_val     =     HashFunc  (  key  );      hash_node  *     entry     =     hashtable  [  hash_val  ];      // if key has no value stored      if     (  entry     ==     NULL  )     {      // creating new node      entry     =     new     hash_node  ;      entry  ->  val     =     value  ;      entry  ->  key     =     key  ;      entry  ->  next     =     NULL  ;      entry  ->  prev     =     NULL  ;      hashtable  [  hash_val  ]     =     entry  ;      top  [  hash_val  ]     =     entry  ;      }      // if some values are present      else     {      // traversing till the end of      // the list      while     (  entry     !=     NULL  )      entry     =     entry  ->  next  ;      // creating the new node      entry     =     new     hash_node  ;      entry  ->  val     =     value  ;      entry  ->  key     =     key  ;      entry  ->  next     =     NULL  ;      entry  ->  prev     =     top  [  hash_val  ];      top  [  hash_val  ]  ->  next     =     entry  ;      top  [  hash_val  ]     =     entry  ;      }      cout      < <     'Value '      < <     value      < <     ' was successfully'      ' added at key '      < <     key      < <     endl  ;      }   };   // Driver Code   int     main  ()   {      HashMap     hash  ;      hash  .  add  (  4       5  );      hash  .  find  (  4  );      hash  .  remove  (  4  );      return     0  ;   }   
Java
   // Java implementation of Hashtable   // using doubly linked list   class   GFG     {      static     final     int     tablesize     =     25  ;      // declaration of node      static     class   hash_node     {      int     val       key  ;      hash_node     next  ;      hash_node     prev  ;      }      // hashmap's declaration      static     class   HashMap     {      hash_node     hashtable  []       top  []  ;      // constructor      HashMap  ()      {      // create a empty hashtable      hashtable     =     new     hash_node  [  tablesize  ]  ;      top     =     new     hash_node  [  tablesize  ]  ;      for     (  int     i     =     0  ;     i      <     tablesize  ;     i  ++  )     {      hashtable  [  i  ]     =     null  ;      top  [  i  ]     =     null  ;      }      }      // hash function definition      int     HashFunc  (  int     key  )     {     return     key     %     tablesize  ;     }      // searching method      void     find  (  int     key  )      {      // Applying hashFunc to find      // index for given key      int     hash_val     =     HashFunc  (  key  );      boolean     flag     =     false  ;      hash_node     entry     =     hashtable  [  hash_val  ]  ;      // if hashtable at that index has some      // values stored      if     (  entry     !=     null  )     {      while     (  entry     !=     null  )     {      if     (  entry  .  key     ==     key  )     {      flag     =     true  ;      }      if     (  flag  )     {      System  .  out  .  println  (      'Element found at key '     +     key      +     ': '     +     entry  .  val  );      }      entry     =     entry  .  next  ;      }      }      if     (  !  flag  )      System  .  out  .  println  (      'No Element found at key '     +     key  );      }      // removing an element      void     remove  (  int     key  )      {      // Applying hashFunc to find      // index for given key      int     hash_val     =     HashFunc  (  key  );      hash_node     entry     =     hashtable  [  hash_val  ]  ;      if     (  entry  .  key     !=     key     ||     entry     ==     null  )     {      System  .  out  .  println  (      'Couldn't find any element at this key '      +     key  );      return  ;      }      // if some values are present at that key &      // traversing the list and removing all values      while     (  entry     !=     null  )     {      if     (  entry  .  next     ==     null  )     {      if     (  entry  .  prev     ==     null  )     {      hashtable  [  hash_val  ]     =     null  ;      top  [  hash_val  ]     =     null  ;      break  ;      }      else     {      top  [  hash_val  ]     =     entry  .  prev  ;      top  [  hash_val  ]  .  next     =     null  ;      entry     =     top  [  hash_val  ]  ;      }      }      entry     =     entry  .  next  ;      }      System  .  out  .  println  (      'Element was successfully removed at the key '      +     key  );      }      // inserting method      void     add  (  int     key       int     value  )      {      // Applying hashFunc to find      // index for given key      int     hash_val     =     HashFunc  (  key  );      hash_node     entry     =     hashtable  [  hash_val  ]  ;      // if key has no value stored      if     (  entry     ==     null  )     {      // creating new node      entry     =     new     hash_node  ();      entry  .  val     =     value  ;      entry  .  key     =     key  ;      entry  .  next     =     null  ;      entry  .  prev     =     null  ;      hashtable  [  hash_val  ]     =     entry  ;      top  [  hash_val  ]     =     entry  ;      }      // if some values are present      else     {      // traversing till the end of      // the list      while     (  entry     !=     null  )      entry     =     entry  .  next  ;      // creating the new node      entry     =     new     hash_node  ();      entry  .  val     =     value  ;      entry  .  key     =     key  ;      entry  .  next     =     null  ;      entry  .  prev     =     top  [  hash_val  ]  ;      top  [  hash_val  ]  .  next     =     entry  ;      top  [  hash_val  ]     =     entry  ;      }      System  .  out  .  println  (      'Value '     +     value      +     ' was successfully added at key '     +     key  );      }      }      // Driver Code      public     static     void     main  (  String  []     args  )      {      HashMap     hash     =     new     HashMap  ();      hash  .  add  (  4       5  );      hash  .  find  (  4  );      hash  .  remove  (  4  );      }   }   // This code is contributed by Lovely Jain   
Python3
   # Python implementation of Hashtable   # using doubly linked list   # declaration of node   class   hash_node  :   def   __init__  (  self     val     key  ):   self  .  val   =   val   self  .  key   =   key   self  .  next   =   None   self  .  prev   =   None   # hashmap's declaration   class   HashMap  :   def   __init__  (  self  ):   # create an empty hashtable   self  .  tablesize   =   25   self  .  hashtable   =   [  None  ]   *   self  .  tablesize   self  .  top   =   [  None  ]   *   self  .  tablesize   # hash function definition   def   HashFunc  (  self     key  ):   return   key   %   self  .  tablesize   # searching method   def   find  (  self     key  ):   # Applying hashFunc to find   # index for given key   hash_val   =   self  .  HashFunc  (  key  )   flag   =   False   entry   =   self  .  hashtable  [  hash_val  ]   # if hashtable at that index has some   # values stored   if   entry   is   not   None  :   while   entry   is   not   None  :   if   entry  .  key   ==   key  :   flag   =   True   if   flag  :   print  (  'Element found at key'     key     ':'     entry  .  val  )   entry   =   entry  .  next   if   not   flag  :   print  (  'No Element found at key'     key  )   # removing an element   def   remove  (  self     key  ):   # Applying hashFunc to find   # index for given key   hash_val   =   self  .  HashFunc  (  key  )   entry   =   self  .  hashtable  [  hash_val  ]   if   entry   is   None   or   entry  .  key   !=   key  :   print  (  'Couldn't find any element at this key'     key  )   return   # if some values are present at that key &   # traversing the list and removing all values   while   entry   is   not   None  :   if   entry  .  next   is   None  :   if   entry  .  prev   is   None  :   self  .  hashtable  [  hash_val  ]   =   None   self  .  top  [  hash_val  ]   =   None   del   entry   break   else  :   self  .  top  [  hash_val  ]   =   entry  .  prev   self  .  top  [  hash_val  ]  .  next   =   None   del   entry   entry   =   self  .  top  [  hash_val  ]   entry   =   entry  .  next   print  (  'Element was successfully removed at the key'     key  )   # inserting method   def   add  (  self     key     value  ):   # Applying hashFunc to find   # index for given key   hash_val   =   self  .  HashFunc  (  key  )   entry   =   self  .  hashtable  [  hash_val  ]   # if key has no value stored   if   entry   is   None  :   # creating new node   entry   =   hash_node  (  value     key  )   self  .  hashtable  [  hash_val  ]   =   entry   self  .  top  [  hash_val  ]   =   entry   # if some values are present   else  :   # traversing till the end of   # the list   while   entry  .  next   is   not   None  :   entry   =   entry  .  next   # creating the new node   new_entry   =   hash_node  (  value     key  )   new_entry  .  prev   =   entry   entry  .  next   =   new_entry   self  .  top  [  hash_val  ]   =   new_entry   print  (  'Value'     value     'was successfully added at key'     key  )   # Driver Code   if   __name__   ==   '__main__'  :   hash_map   =   HashMap  ()   hash_map  .  add  (  4     5  )   hash_map  .  find  (  4  )   hash_map  .  remove  (  4  )   
C++
   // Java implementation of Hashtable using doubly linked list   class     GFG     {      static     final     int     tablesize     =     25  ;      // declaration of node      static     class     hash_node     {      int     val       key  ;      hash_node     next  ;      hash_node     prev  ;      }      // hashmap's declaration      static     class     HashMap     {      hash_node     hashtable  []     top  [];      // constructor      HashMap  (){      // create a empty hashtable      hashtable     =     new     hash_node  [  tablesize  ];      top     =     new     hash_node  [  tablesize  ];      for     (  int     i     =     0  ;     i      <     tablesize  ;     i  ++  )     {      hashtable  [  i  ]     =     null  ;      top  [  i  ]     =     null  ;      }      }      // hash function definition      int     HashFunc  (  int     key  )     {     return     key     %     tablesize  ;     }      // searching method      void     find  (  int     key  )      {      // Applying hashFunc to find index for given key      int     hash_val     =     HashFunc  (  key  );     boolean     flag     =     false  ;      hash_node     entry     =     hashtable  [  hash_val  ];      // if hashtable at that index has some values stored      if     (  entry     !=     null  )     {      while     (  entry     !=     null  )     {      if     (  entry  .  key     ==     key  )     flag     =     true  ;      if     (  flag  )     {      System  .  out  .  println  (  'Element found at key '     +     key  +     ': '     +     entry  .  val  );      }      entry     =     entry  .  next  ;      }      }      if     (  !  flag  )      System  .  out  .  println  (  'No Element found at key '     +     key  );      }      // removing an element      void     remove  (  int     key  )      {      // Applying hashFunc to find index for given key      int     hash_val     =     HashFunc  (  key  );      hash_node     entry     =     hashtable  [  hash_val  ];      if     (  entry  .  key     !=     key     ||     entry     ==     null  )     {      System  .  out  .  println  (  'Couldn't find any element at this key '  +     key  );      return  ;      }      // if some values are present at that key & traversing the list and removing all values      while     (  entry     !=     null  )     {      if     (  entry  .  next     ==     null  )     {      if     (  entry  .  prev     ==     null  )     {      hashtable  [  hash_val  ]     =     null  ;      top  [  hash_val  ]     =     null  ;      break  ;      }      else     {      top  [  hash_val  ]     =     entry  .  prev  ;      top  [  hash_val  ].  next     =     null  ;      entry     =     top  [  hash_val  ];      }      }      entry     =     entry  .  next  ;      }      System  .  out  .  println  (      'Element was successfully removed at the key '      +     key  );      }      // inserting method      void     add  (  int     key       int     value  )      {      // Applying hashFunc to find index for given key      int     hash_val     =     HashFunc  (  key  );      hash_node     entry     =     hashtable  [  hash_val  ];      // if key has no value stored      if     (  entry     ==     null  )     {      // creating new node      entry     =     new     hash_node  ();      entry  .  val     =     value  ;      entry  .  key     =     key  ;      entry  .  next     =     null  ;      entry  .  prev     =     null  ;      hashtable  [  hash_val  ]     =     entry  ;      top  [  hash_val  ]     =     entry  ;      }      // if some values are present      else     {      // traversing till the end of      // the list      while     (  entry     !=     null  )      entry     =     entry  .  next  ;      // creating the new node      entry     =     new     hash_node  ();      entry  .  val     =     value  ;      entry  .  key     =     key  ;      entry  .  next     =     null  ;      entry  .  prev     =     top  [  hash_val  ];      top  [  hash_val  ].  next     =     entry  ;      top  [  hash_val  ]     =     entry  ;      }      System  .  out  .  println  (      'Value '     +     value      +     ' was successfully added at key '     +     key  );      }      }      // Driver Code      public     static     void     main  (  String  []     args  )      {      HashMap     hash     =     new     HashMap  ();      hash  .  add  (  4       5  );      hash  .  find  (  4  );      hash  .  remove  (  4  );      }   }   // This code is contributed by Lovely Jain   
JavaScript
   // JavaScript implementation of Hashtable using doubly linked list   const     tablesize     =     25  ;   // declaration of node   class     hash_node     {   constructor  (  key       val  )     {   this  .  key     =     key  ;   this  .  val     =     val  ;   this  .  next     =     null  ;   this  .  prev     =     null  ;   }   }   // hashmap's declaration   class     HashMap     {   constructor  ()     {   // create a empty hashtable   this  .  hashtable     =     new     Array  (  tablesize  ).  fill  (  null  );   this  .  top     =     new     Array  (  tablesize  ).  fill  (  null  );   }   // hash function definition   HashFunc  (  key  )     {   return     key     %     tablesize  ;   }   // searching method   find  (  key  )     {   // Applying hashFunc to find index for given key   const     hash_val     =     this  .  HashFunc  (  key  );   let     flag     =     false  ;   let     entry     =     this  .  hashtable  [  hash_val  ];   // if hashtable at that index has some values stored   if     (  entry     !==     null  )     {      while     (  entry     !==     null  )     {      if     (  entry  .  key     ===     key  )     flag     =     true  ;      if     (  flag  )     {      console  .  log  (  `Element found at key   ${  key  }  :   ${  entry  .  val  }  `  );      }      entry     =     entry  .  next  ;      }   }   if     (  !  flag  )     console  .  log  (  `No Element found at key   ${  key  }  `  );   }   // removing an element   remove  (  key  )     {   // Applying hashFunc to find index for given key   const     hash_val     =     this  .  HashFunc  (  key  );   let     entry     =     this  .  hashtable  [  hash_val  ];   if     (  entry  .  key     !==     key     ||     entry     ===     null  )     {      console  .  log  (  `Couldn't find any element at this key   ${  key  }  `  );      return  ;   }   // if some values are present at that key & traversing the list and removing all values   while     (  entry     !==     null  )     {      if     (  entry  .  next     ===     null  )     {      if     (  entry  .  prev     ===     null  )     {      this  .  hashtable  [  hash_val  ]     =     null  ;      this  .  top  [  hash_val  ]     =     null  ;      break  ;      }     else     {      this  .  top  [  hash_val  ]     =     entry  .  prev  ;      this  .  top  [  hash_val  ].  next     =     null  ;      entry     =     this  .  top  [  hash_val  ];      }      }      entry     =     entry  .  next  ;   }   console  .  log  (  `Element was successfully removed at the key   ${  key  }  `  );   }   // inserting method   add  (  key       value  )     {   // Applying hashFunc to find index for given key   const     hash_val     =     this  .  HashFunc  (  key  );   let     entry     =     this  .  hashtable  [  hash_val  ];   // if key has no value stored   if     (  entry     ===     null  )     {      // creating new node      entry     =     new     hash_node  (  key       value  );      this  .  hashtable  [  hash_val  ]     =     entry  ;      this  .  top  [  hash_val  ]     =     entry  ;   }   // if some values are present   else     {      // traversing till the end of the list      while     (  entry     !==     null  )     entry     =     entry  .  next  ;      // creating the new node      entry     =     new     hash_node  (  key       value  );      entry  .  prev     =     this  .  top  [  hash_val  ];      this  .  top  [  hash_val  ].  next     =     entry  ;      this  .  top  [  hash_val  ]     =     entry  ;   }   console  .  log  (  `Value   ${  value  }   was successfully added at key   ${  key  }  `  );   }   }   // Driver Code   const     hash     =     new     HashMap  ();   hash  .  add  (  4       5  );   hash  .  find  (  4  );   hash  .  remove  (  4  );   

الإخراج
Value 5 was successfully added at key 4 Element found at key 4: 5 Element was successfully removed at the key 4 
إنشاء اختبار