fix few details, hash table

This commit is contained in:
Mari Wahl 2014-08-27 13:05:14 -04:00
parent eeeb3c4e4b
commit 2d9a204f00
15 changed files with 70 additions and 144 deletions

Binary file not shown.

View File

@ -0,0 +1 @@
__all__=["hash_tables", "heap", "linked_list", "queues", "stacks"]

View File

@ -1,65 +0,0 @@
#!/usr/bin/python3
# mari von steinkirch @2013
# steinkirch at gmail
''' The first example design a Hash table using chaining to avoid collisions. The second
uses two lists.'''
from linked_list_fifo import Node, LinkList
class HashTableLL(object):
def __init__(self, size):
self.size = size
self.slots = []
self._createHashTable()
def _createHashTable(self):
for i in range(self.size) :
self.slots.append(LinkList())
def findIndex(self, item):
return item%self.size
def addItem(self, item):
index = self.findIndex(item)
self.slots[index].addNode(item)
return self
def delItem(self, item):
index = self.findIndex(item)
self.slots[index].deleteNode(item)
return self
def printHashTable(self):
for i in range(self.size):
print('\nSlot {}:'.format(i))
print(self.slots[i].printList())
def test_hash_tables():
H1 = HashTableLL(3)
for i in range (0, 20):
H1.addItem(i)
H1.printHashTable()
print('\n\nNow deleting:')
H1.delItem(0)
H1.delItem(0)
H1.delItem(0)
H1.delItem(0)
H1.printHashTable()
'''
H2 = HashTable2L(3)
H2[54]="buffy"
H2[26]="xander"
H2[17]="giles"
print(H.2slots)
'''
if __name__ == '__main__':
test_hash_tables()

View File

@ -0,0 +1,61 @@
#!/usr/bin/python
__author__ = "Mari Wahl"
__email__ = "marina.w4hl@gmail.com"
''' design a Hash table using chaining to avoid collisions.'''
#import abstract_structures.linked_list.linked_list_fifo
#import abstract_structures.linked_list.node
from linked_list_fifo import LinkedListFIFO
class HashTableLL(object):
def __init__(self, size):
self.size = size
self.slots = []
self._createHashTable()
def _createHashTable(self):
for i in range(self.size) :
self.slots.append(LinkedListFIFO())
def _find(self, item):
return item%self.size
def _add(self, item):
index = self._find(item)
self.slots[index].addNode(item)
def _delete(self, item):
index = self._find(item)
self.slots[index].deleteNode(item)
def _print(self):
for i in range(self.size):
print('\nSlot {}:'.format(i))
print(self.slots[i]._printList())
def test_hash_tables():
H1 = HashTableLL(3)
for i in range (0, 20):
H1._add(i)
H1._print()
print('\n\nNow deleting:')
H1._delete(0)
H1._delete(1)
H1._delete(2)
H1._delete(0)
H1._print()
if __name__ == '__main__':
test_hash_tables()

View File

@ -50,12 +50,6 @@ class LinkedListFIFO(object):
self.tail.pointer = node self.tail.pointer = node
self.tail = node self.tail = node
# delete a node in some position
def _delete(self, prev, node):
self.length -= 1
prev.pointer = node.pointer
if not node.pointer:
self.tail = prev
# add nodes in general # add nodes in general
def addNode(self, value): def addNode(self, value):
@ -81,8 +75,14 @@ class LinkedListFIFO(object):
self._deleteFirst() self._deleteFirst()
else: else:
node, prev, i = self._find(index) node, prev, i = self._find(index)
if i == index: if i == index and node:
self._delete(prev, node) self.length -= 1
if i == 0 or not prev :
self.head = node.pointer
else:
prev.pointer = node.pointer
if not self.tail == node:
self.tail = prev
else: else:
print('Node with index {} not found'.format(index)) print('Node with index {} not found'.format(index))

View File

@ -1,71 +0,0 @@
#!/usr/bin/python3
# mari von steinkirch @2013
# steinkirch at gmail
class Node(object):
def __init__(self,data=None,next=None):
self.data = data
self.next = next
def setnext(self,next):
self.next = next
def __str__(self):
return "%s" % self.data
class LinkedListStack(object):
''' linked list from stack '''
def __init__(self, max=0):
self.max = max
self.head = None
self.z = None
self.size = 0
def push(self, data):
if self.size == 0:
self.head = Node(data=data)
self.size += 1
else:
head = self.head
temp = Node(data = data)
self.head = temp
self.head = temp
temp.setnext(head)
def pop(self):
temp = self.head.next
self.head = temp
def isEmpty(self):
return self.size == 0
def __str__(self):
d = ""
if self.isEmpty(): return ""
else:
temp = self.head
d += "%s\n" % temp
while temp.next != None:
temp = temp.next
d += "%s\n" % temp
return d
def test_ll_from_stack():
ll = LinkedListStack(max = 20)
ll.push("1")
ll.push("2")
ll.push("3")
ll.push("4")
print(ll)
ll.pop()
print(ll)
if __name__ == '__main__':
test_ll_from_stack()