예제 #1
0
class UnsortedPriorityQueue(PriorityQueueBase):
    """
    A min-oriented priority queue implemented with an unsorted list.
    """

    def __init__(self):
        """
        Create an empty Priority Queue.
        :return:
        """
        self._data = PositionalList()

    def _find_min(self):
        """
        Return Position of item with minimum key.
        :return:
        """
        if self.is_empty():
            raise Empty("Priority queue is empty.")
        small = self._data.first()
        walk = self._data.after(small)
        while walk is not None:
            if walk.element() < small.element():
                small = walk
            walk = self._data.after(walk)
        return small

    def min(self):
        """
        Return but do not remove (k,v) tuple with minimum key.
        :return:
        """
        p = self._find_min()
        item = p.element()
        return (item._key, item._value)

    def __len__(self):
        """
        Return the number of items in the priority queue.
        :return:
        """
        return len(self._data)

    def add(self, key, value):
        """
        Add a key-value pair.
        :param key:
        :param value:
        :return:
        """
        self._data.add_last(self._Item(key, value))

    def remove_min(self):
        """
        Remove and return (k,v) tuple with minimum key.
        :return:
        """
        p = self._find_min()
        item = self._data.delete(p)
        return (item._key, item._value)
예제 #2
0
class UnsortedPriorityQueue(PriorityQueueBase):
    def _recalculate_min(self):
        if self.is_empty():
            raise Empty("Priority queue is empty")
        small = self._data.first()
        walk = self._data.after(small)
        while walk is not None:
            if walk.element() < small.element():
                small = walk
            walk = self._data.after(walk)
        self._min = small

    def __init__(self):
        self._data = PositionalList()
        self._min = self._Item(float('inf'), None)

    def __len__(self):
        return len(self._data)

    def add(self, key, value):
        item = self._Item(key, value)
        if key > self._min._key:
            self._min = item
        self._data.add_last(item)

    def min(self):
        item = self._min
        return item._key, item._value

    def remove_min(self):
        p = self._min
        item = self._data.delete(p)
        self._recalculate_min()
        return item._key, item._value
예제 #3
0
class UnsortedPriorityQueue(PriorityQueueBase):
    def _find_min(self):
        if self.is_empty():
            raise Empty("Priority queue is empty")
        small = self._data.first()
        walk = self._data.after(small)
        while walk is not None:
            if walk.element() < small.element():
                small = walk
            walk = self._data.after(walk)
        return small

    def __init__(self):
        self._data = PositionalList()

    def __len__(self):
        return len(self._data)

    def add(self, key, value):
        self._data.add_last(self._Item(key, value))

    def min(self):
        p = self._find_min()
        item = p.element()
        return item._key, item._value

    def remove_min(self):
        p = self._find_min()
        item = self._data.delete(p)
        return item._key, item._value
예제 #4
0
    def top(self, k):
        """
        Generate sequence of top k elements in terms of access count.
        :param k:
        :return:
        """
        if not 1 <= k <= len(self):
            raise ValueError("Illegal value for k.")

        temp = PositionalList()
        for item in self._data:
            temp.add_last(item)

        for j in range(k):
            #find and report next highest form temp
            ## O(kn)
            highPos = temp.first()
            walk = temp.after(highPos)
            while walk is not None:
                if walk.element()._count > highPos.element()._count:
                    highPos = walk
                walk = temp.after(walk)

            yield highPos.element()._value
            temp.delete(highPos)
예제 #5
0
    def top(self, k):
        """
        generate sequence of top k elements in terms of access count
        :param k:
        :return:
        """
        if not 1 <= k <= len(self):
            raise ValueError('illegal value for k')

        # making a copy of the original list
        temp = PositionalList()
        for item in self._data:  # positional lists support iteration
            temp.add_last(item)

        # repeatedly find, report and remove element with largest count
        for j in range(k):
            # find and report next highest from temp
            highPos = temp.first()
            walk = temp.after(highPos)
            while walk is not None:
                if walk.element()._count > highPos.element()._count:
                    highPos = walk
                walk = temp.after(walk)
            # found the element with highest count
            yield highPos.element()._value  # report element to user
            temp.delete(highPos)  # remove from temp list
예제 #6
0
    def top(self, k):
        """
        Generate sequence of top k elements in terms of access count.
        :param k:
        :return:
        """
        if not 1 <= k <= len(self):
            raise ValueError("Illegal value for k.")

        temp = PositionalList()
        for item in self._data:
            temp.add_last(item)

        for j in range(k):
            #find and report next highest form temp
            ## O(kn)
            highPos = temp.first()
            walk = temp.after(highPos)
            while walk is not None:
                if walk.element()._count > highPos.element()._count:
                    highPos = walk
                walk = temp.after(walk)

            yield highPos.element()._value
            temp.delete(highPos)
class UnsortedPriorityQueue(PriorityQueueBase):
    """ A min-oriented priority queue implemented with an unsorted list
        min() : O(n)
        remove_min : O(n)
        add() : O(1)
    """

    def __init__(self):
        self._data = PositionalList()

    def __len__(self):
        return len(self._data)

    def add(self, key, value):
        self._data.add_last(self._Item(key, value))

    def min(self):
        """
        :return: (k,v) tuple with minimum key (not remove)
        """
        p = self._find_min()
        item = p.element()
        return (item._key, item._value)

    def remove_min(self):
        """
        :return: remove and return (k,v) with minimum key k
        """
        p = self._find_min()
        item = self._data.delete(p)
        return (item._key, item._value)

    def _find_min(self):
        """
        :return: Position of item with minimum key
        """
        if self.is_empty():
            raise EmptyException('Priority Queue is empty')
        small = self._data.first()
        walk = self._data.after(small)
        while walk is not None:
            if walk.element() < small.element():
                small = walk
            walk = self._data.after(walk)
        return small

    def __str__(self):
        res = []
        walk = self._data.first()
        while walk is not None:
            item = walk.element()
            res.append((item._key, item._value))
            walk = self._data.after(walk)
        return str(res)
예제 #8
0
def main():
    global screen,SCREEN_WIDTH,SCREEN_SIZE,deltaX,deltaY
    vertex=PositionalList()
    running=True
    done=False
    clickTrue=False
    getPrev=False
    deltaX=0
    deltaY=0
    x=0
    y=0
    screen.fill((255,255,255))
    while running:
        for event in pygame.event.get():
            if event.type==pygame.QUIT:
                running=False
            elif event.type==pygame.MOUSEBUTTONDOWN:
                (posx,posy)=pygame.mouse.get_pos()
                if done==False and len(vertex)>=0:
                    if (x-posx)**2+(y-posy)**2<=25:
                        vertex.add_last(vertex.first().element())
                    else:
                        vertex.add_last((posx,posy))
                    if len(vertex)>1:
                        (x,y)=vertex.first().element()
                        if (x-posx)**2+(y-posy)**2<=25:
                            done=True
                            (posx,posy)=vertex.first().element()
                        p=vertex.before(vertex.last())
                        pygame.draw.line(screen,(0,0,0),p.element(),(posx,posy))
                    pygame.draw.circle(screen,(0,0,0),(posx,posy),5)
                else:
                    if click(vertex,(posx,posy)):
                        clickTrue=not clickTrue
                        getPrev=False

            elif event.type==pygame.MOUSEMOTION and clickTrue:
                    if done==True:
                        (posx,posy)=pygame.mouse.get_pos()
                        screen.fill((255,255,255))
                        if getPrev:
                            deltaX=(posx-pPosx)
                            deltaY=(posy-pPosy)
                        updateVertex(vertex,deltaX,deltaY)
                        drawPolygon(vertex)
                        getPrev=True
                        (pPosx, pPosy) = (posx,posy)
            elif event.type==pygame.MOUSEBUTTONUP:
                clickTrue=False
        pygame.display.flip()
예제 #9
0
class FavoritesList:
    """ List of elements from most accessed to list """

    class _Item:
        __slots__ = '_value', '_count'

        def __init__(self, e):
            self._value = e
            self._count = 0

    def __init__(self):
        self._data = PositionalList()

    def __len__(self):
        return len(self._data)

    def is_empty(self):
        return len(self._data) == 0

    def _find_position(self, e):
        walk = self._data.first()
        while walk is not None and walk.element()._value != e:
            walk = self._data.after(walk)
        return walk

    def _move_up(self, p):
        """ Based on access count
        """
        if p != self._data.first():
            cnt = p.element()._count
            walk = self._data.before(p)
            if cnt > walk.element()._count:
                while (walk != self._data.first()
                       and cnt > self._data.before(walk).element()._count):
                    walk = self._data.before(walk)
                self._data.add_before(walk, self._data.delete(p))

    def access(self, e):
        p = self._find_position(e)
        if p is None:
            p = self._data.add_last(self._Item(e))
        p.element()._count += 1
        self._move_up(p)

    def remove(self, e):
        p = self._find_position(e)
        if p is not None:
            self._data.delete(p)

    def top(self, k):
        """
        :return: sequence of top k elements
        """
        if not 1 <= k <= len(self):
            raise ValueError('Illegal value for k')
        walk = self._data.first()
        for j in range(k):
            item = walk.element()
            yield item._value
            walk = self._data.after(walk)
예제 #10
0
class FavoritesList:
    class _Item:
        __slots__ = '_value', '_count'

        def __init__(self, v):
            self._value = v
            self._count = 0

    def _find_position(self, e):
        """ Search for element e and return its Position """
        walk = self._data.first()
        while walk is not None and walk.element()._value != e:
            walk = self._data.after(walk)
        return walk

    def _move_up(self, p):
        """ Move item at Position p earlier in the list based on access count """
        if p != self._data.first():
            walk = self._data.before(p)
            cnt = p.element()._count
            if cnt > walk.element()._count:
                while walk != self._data.first() and cnt > self._data.before(
                        walk).element()._count:
                    walk = self._data.before(walk)
                self._data.add_before(walk, self._data.delete(p))

    """ ==================================Public Methods==================================== """

    def __init__(self):
        self._data = PositionalList()

    def __len__(self):
        return len(self._data)

    def is_empty(self):
        return self._data.is_empty()

    def access(self, e):
        """ Access element e, thereby increasing its access count """
        p = self._find_position(e)

        if p is None:
            p = self._data.add_last(self._Item(e))
        p.element()._count += 1
        self._move_up(p)

    def remove(self, e):
        p = self._find_position(e)
        if p is not None:
            self._data.delete(p)

    def top(self, k):
        if not 1 <= k <= len(self):
            raise ValueError("Illegal value for k")
        walk = self._data.first()
        for _ in range(k):
            item = walk.element()._value
            yield item
            walk = self._data.after(walk)
예제 #11
0
    def top(self, k):
        if not 1 <= k <= len(self):
            raise ValueError("Ilegal value for k")

        temp = PositionalList()
        for item in self._data:
            temp.add_last(item)

        for j in range(k):
            highPos = temp.fist()
            walk = temp.after(highPos)
            while walk is not None:
                if walk.element()._count > highPos.element()._count:
                    highPos = walk
                walk = temp.after(walk)
            yield highPos.element()._value
            temp.delete(highPos)
예제 #12
0
    def top(self, k):
        if not 1 <= k <= len(self):
            raise ValueError('Bad k')

        temp = PositionalList()
        for item in self._data:
            temp.add_last(item)

        # we repeatedly find, report, and remove element with largest count
        for j in range(k):
            highPos = temp.first()
            walk = temp.after(highPos)
            while walk is not None:
                if walk.element()._count > highPos.element()._count:
                    highPos = walk
                walk = temp.after(walk)
            yield highPos.element()._value
            temp.delete(highPos)
예제 #13
0
    def top(self, k):
        """Generate sequnce of top k elements in terms of access count"""
        if not 1 <= k <= len(self):
            raise ValueError("Illegal value for k")

        # we begin by making a copy of the original list
        temp = PositionalList()
        for item in self._data:
            temp.add_last(item)

        # we repeatedly find, report, and remove element with largest count
        for j in range(k):
            # find and report next highest from temp
            highPos = temp.first()
            walk = temp.after(highPos)
            while walk is not None:
                if walk.element()._count > highPos.element()._count:
                    highPos = walk
                walk = temp.after(walk)
            # we have found the element with highest count
            yield highPos.element()._value
            temp.delete(highPos)
예제 #14
0
    def top(self, k):
        """Generate sequence of top k elements in terms of access count."""
        if not 1 <= k <= len(self):
            raise ValueError('Illegal value for k')

        # we begin by making a copy of the original list
        temp = PositionalList()
        for item in self._data: # positional lists support iteration
            temp.add_last(item)

        # we repeatedly find, report, and remove element with largest count
        for j in range(k):
            # find and report next highest from temp
            highPos = temp.first()
            walk = temp.after(highPos)
            while walk is not None:
                if walk.element()._count > highPos.element()._count:
                    highPos = walk
                walk = temp.after(walk)
            # we have found the element with highest count
            yield highPos.element()._value # report element to user
            temp.delete(highPos) # remove from temp list
class UnsortedPriorityQueue(PriorityQueueBase):
    """A min-oriented priority queue implemented with an unsorted list"""
    def __init__(self):
        self._data = PositionalList()

    def _find_min(self):
        """Return Position of item with minimum key"""
        if self._data.is_empty():  # empty queue
            raise ValueError("Empty Priority Queue")
        small = self._data.first()
        walk = self._data.after(small)
        while walk != None:
            # find a item with smaller key or higher priority
            if small.element() > walk.element():
                small = walk
            walk = self._data.after(walk)
        return small

    def __len__(self):
        return len(self._data)

    def add(self, key, value):
        """Add a key-value pair"""
        self._data.add_last(self._Item(key, value))

    def min(self):
        """Return but do not remove (k,v) tuple with minimum key"""
        item = self._find_min().element()
        return item._key, item._value

    def remove_min(self):
        """Remove and return (k,v) tuple with minimum key"""
        p = self._find_min()  # find the position
        item = self._data.delete(
            p)  # delete the position and return the element
        return item._key, item._value
class UnsortedPQ(PriorityQueueBase):
    """ Unsorted priority queue """
    def __init__(self):
        self._data = PositionalList()

    def __len__(self):
        return len(self._data)

    def _find_min(self):

        if self.is_empty():
            raise Empty("Queue is empty!")
        min = self._data.first()
        walker = self._data.after(min)
        while walker is not None:
            if min.item() > walker.item():
                min = walker
            walker = self._data.after(walker)
        return min

    def min(self):
        p = self._find_min()
        return p.item()._key, p.item()._val

    def remove_min(self):
        p = self._find_min()
        item = p.item()
        self._data.delete(p)
        return item._key, item._val

    def add(self, k, v):
        self._data.add_last(self._Item(k, v))

    def __iter__(self):
        for item in self._data:
            yield item
예제 #17
0
class AdaptableUnsortedPriorityQueue(PriorityQueueBase):
    class Locator(PriorityQueueBase._Item):
        __slots__ = '_index'

        def __init__(self, k, v, j):
            super().__init__(k, v)
            self._index = j

    def update(self, loc, newkey, newval):
        item = loc.element()
        item._value = newval
        item._key = newkey

    def remove(self, loc):
        item = self._data.remove(loc)
        return item._key, item._value

    def _find_min(self):
        if self.is_empty():
            raise Empty("Priority queue is empty")
        small = self._data.first()
        walk = self._data.after(small)
        while walk is not None:
            if walk.element() < small.element():
                small = walk
            walk = self._data.after(walk)
        return small

    def __init__(self):
        self._data = PositionalList()

    def __len__(self):
        return len(self._data)

    def add(self, key, value):
        return self._data.add_last(self._Item(key, value))

    def min(self):
        p = self._find_min()
        item = p.element()
        return item._key, item._value


    def remove_min(self):
        p = self._find_min()
        item = self._data.delete(p)
        return item._key, item._value
예제 #18
0
class FavorateListMTFAd(FavoritesListMTF):
    """Subclass of FavoritesListMTF,but the elements that have not been
       accessed in the most resent n accesses are automatically purged
       from the list.
    """

    #------------------------------ nested Item class ------------------------------
    class _Item:
        __slots__ ='_value','_count'# streamline memory usage
        def __init__ (self, e):
            self._value = e # the user s element
            self._count = 0 # access count initially zero
            self._accessnum = 0

    def __init__ (self,maxnum):
        """Create an empty list of favorites."""
        self._data = PositionalList() # will be list of Item instances
        self._accessnum = 0
        self._max = maxnum

    def access(self, e):
        """Access element e, thereby increasing its access count."""
        self._accessnum += 1
        p = self._find_position(e) # try to locate existing element
        if p is None:
            p = self._data.add_last(self._Item(e)) # if new, place at end
        p.element()._count += 1 # always increment count
        p.element()._accessnum = self._accessnum
        self._move_up(p) # consider moving forward
        if self._data.last().element()._accessnum == (self._accessnum - self._max) :
            self._data.delete(self._data.last())

    def showinfo(self):
        """Show the infomation of the current list"""
        print 'Favoriteslist info:[',
        for i in self:
            print '(',i._value,',',i._count,',',i._accessnum,')',
        print ']'
예제 #19
0
class FavoritesList:
    """
    list of elements ordered from most frequently accessed to lest
    """

    # ------------ nested _Item class ---------------------------
    class _Item:
        __slots__ = '_value', '_count'  # streamline memory usage

        def __init__(self, element):
            self._value = element  # the user's element
            self._count = 0  # access count initially zero

    # ------------ non-public utilities --------------------------
    def _find_position(self, element):
        """
        search for element and return its Position (or None if not found)
        :param element:
        :return:
        """
        walk = self._data.first()
        while walk is not None and walk.element()._value != element:
            walk = self._data.after(walk)
        return walk

    def _move_up(self, position):
        """
        move item at position earlier in the list based on access count
        :param position:
        :return:
        """
        if position != self._data.first():  # consider moving
            cnt = position.element()._count
            walk = self._data.before(position)
            if cnt > walk.element()._count:  # must shift forward
                while (walk != self._data.first() and cnt > self._data.before(walk).element()._count):
                    walk = self._data.before(walk)
                self._data.add_before(walk, self._data.delete(position))  # delete / reinsert

    # ------------ public methods ---------------------------------
    def __init__(self):
        """
        create an empty list of favorites
        """
        self._data = PositionalList()  # list of _Item instances

    def __len__(self):
        """
        return number of entries on favorites list
        :return:
        """
        return len(self._data)

    def is_empty(self):
        """
        return True if list is empty
        :return:
        """
        return len(self._data) == 0

    def access(self, element):
        """
        access element, thereby increasing its access count
        :param element:
        :return:
        """
        position = self._find_position(element)  # try to locate existing element
        if position is None:
            position = self._data.add_last(self._Item(element))  # if new, place at end
        position.element()._count += 1  # always increment count
        self._move_up(position)  # consider moving forward

    def remove(self, element):
        """
        remove element from the list of favorites
        :param element:
        :return:
        """
        position = self._find_position(element)  # try to locate existing element
        if position is not None:  # delete if found
            self._data.delete(position)

    def top(self, k):
        """
        generate sequence of top k elements in terms of access count
        :param k:
        :return:
        """
        if not 1 <= k <= len(self):
            raise ValueError('Illegal value for k')
        walk = self._data.first()
        for j in range(k):
            item = walk.element()  # element of list is _Item
            yield item._value
            walk = self._data.after(walk)

    def clear(self):
        """
        returns the list to empty.
        :return:
        """
        self._data = PositionalList()

    def reset_counts(self):
        """
         resets all elements’ access counts to zero (while leaving the order of
         he list unchanged).
        :return:
        """
        cursor = self._data.first()
        while cursor is not None:
            cursor.element()._count = 0
            cursor = self._data.after(cursor)
예제 #20
0
print(i, L)


# P 407
def pq_sort(C):
    """
    sort a collection of elements stored in a positional list
    :param C:
    :return:
    """
    assert isinstance(C, PositionalList)
    n = len(C)
    P = HeapPriorityQueue()  # could be any PriorityQueue
    # HeapPriorityQueue: O(nlogn) or O(n)[bottom-up heap construction]
    # UnsortedPriorityQueue: O(n^2) selection-sort
    # sortedPriorityQueue: O(n^2) insertion-sort
    for j in range(n):
        element = C.delete(C.first())
        P.add(element, element)  # use element as key and value
    for j in range(n):
        (k, v) = P.remove_min()
        C.add_last(v)  # store smallest remaining element in C


p = PositionalList()
for i in range(10):
    p.add_last(randint(1, 100))
print(p)
pq_sort(p)
print(p)
예제 #21
0
            pivot = L.after(marker)  # next item to place
            value = pivot.element()
            if value > marker.element():  # pivot is already sorted
                marker = pivot
            else:  # must relocate pivot
                walk = marker  # find leftmost item greater than value
                while walk != L.first() and L.before(walk).element() > value:
                    walk = L.before(walk)
                L.delete(pivot)
                L.add_before(walk, value)  # reinsert value before walk


pl = PositionalList()
num = [15,22,25,29,36,23,53,11,42]
for n in num:
    pl.add_last(n)

print('PositionalList before sorting: ', pl)
insertion_sort(pl)
print('PositionalList after sorting: ', pl)


# P 309
class FavoritesList:
    """
    list of elements ordered from most frequently accessed to lest
    """

    # ------------ nested _Item class ---------------------------
    class _Item:
        __slots__ = '_value', '_count'  # streamline memory usage
예제 #22
0
class FavoritesList:
    """
    List of elements ordered from most frequently accessed to least.
    """
    #------------------------------ nested Item class ------------------------------
    class _Item:
        __slots__ = '_value', '_count'

        def __init__(self, e):
            self._value = e
            self._count = 0

    #------------------------------- nonpublic utilities -------------------------------
    def _find_position(self, e):
        """
        Search for element e and return its Position (or None if not found).
        :param e:
        :return:
        """
        walk = self._data.first()
        while walk is not None and walk.element()._value != e:
            walk = self._data.after(walk)
        return walk

    def _move_up(self, p):
        """
        Move item at Position p earlier in the list based on access count.
        :param p:
        :return:
        """
        if p != self._data.first():
            cnt = p.element()._count
            walk = self._data.before(p)
            if cnt > walk.element()._count:
                while (walk != self._data.first() and cnt > self._data.before(walk)._count):
                    walk = self._data.before(walk)
                self._data.add_before(walk, self._data.delete(p))


    #------------------------------- public methods -------------------------------

    def __init__(self):
        """
        Create an empty list of favorites.
        :return:
        """
        self._data = PositionalList()

    def __len__(self):
        """
        Return number of entries on favorites list.
        :return:
        """
        return len(self._data)


    def is_empty(self):
        """
        Return True is list is empty.
        :return:
        """
        return len(self._data) == 0


    def access(self, e):
        """
        Access element e,thereby increasing its access count.
        :param e:
        :return:
        """
        p = self._find_position(e)
        if p is None:
            p = self._data.add_last(self._Item(e))
        p.element()._count += 1
        self._move_up(p)

    def remove(self, e):
        """
        Remove element e from the list of favorites
        :param e:
        :return:
        """
        p = self._find_position(e)
        if p is not None:
            self._data.delete(p)

    def top(self, k):
        """
        Generate sequence of top k elements in terms of access count.
        :param e:
        :return:
        """
        if not 1 <= len(self):
            raise ValueError('Illegal value for k')
        walk = self._data.first()
        for j in range(k):
            item = walk.element()
            yield item._value
            walk = self._data.after(walk)
Its O(N)
"""

from PositionalList import PositionalList


def bubble_sort(l):
    for _ in range(len(l)):
        cur = l.first()
        x = 1
        while len(l) > x:
            next = l.after(cur)
            if cur.element() > next.element():
                l.swap_position(cur, next)
                x += 1
            x += 1
            cur = l.after(cur)


a = PositionalList()
a.add_last(1)
a.add_last(5)
a.add_last(3)
a.add_last(2)
bubble_sort(a)
# a.swap_position(a.first(),a.last())
# print(len(a))
for x in a:
    print(x)
# [print(x) for x in a]
예제 #24
0
        """
        if len(pl) <= 1:
            return

        if not isinstance(pl, PositionalList):
            return

        marker = pl.first()
        while marker != pl.last():
            pivot = pl.after(marker)
            value = pivot.element()
            if value > marker.element():
                marker = pivot
            else:
                walk = marker
                while walk != pl.first() and pl.before(walk).element() > value:
                    walk = pl.before(walk)
                pl.delete(pivot)
                pl.add_before(walk, value)

if __name__ == '__main__':
    pl = PositionalList()
    for k in range(10, 0, -2):
        pl.add_last(k)

    print(pl)

    sorter = InsertionSort()
    sorter.insertion_sort(pl)

    print(pl)
예제 #25
0
from PositionalList import PositionalList 

def printlist(L,s):
    print(s,end=": ")
    for i in L:
        print(i,end=' ')
    print()

L1 = PositionalList()
L2 = PositionalList()
for i in range(5):
    L1.add_last(i)
    L2.add_last(i + 5)
if True:   #Once again, turn these on as you advance through this assignment.
            #Leave them all on when you hand in.
    #Task 1: Append the elements of a given list the end of a list.
    #The given list is basically destroyed.
    #¡Do this in constant time!
    L1.append(L2)
    printlist(L1, 'L1 after appending L2')
    printlist(L2, 'L2 after being appended L1')
    L2.add_last('seventeen')
    printlist(L1, 'L1 after adding \'seventeen\' to L2')
    printlist(L2, 'L2 after adding \'seventeen\' to it')
    # Output
    # L1 after appending L2: 0 1 2 3 4 5 6 7 8 9 
    # L2 after being appended L1:
    #
    # (so L2 is empty)
    # L1 after adding 'seventeen' to L2: 0 1 2 3 4 5 6 7 8 9 
    # L2 after adding 'seventeen' to it: seventeen 
class FavoritesList:

    class _Item:

        def __init__(self, val):
            self._value = val
            self._count = 0

    def __init__(self):
        self._data = PositionalList()

    """ nonpublic utilities """
    def _find_position(self, val):
        walker = self._data.first()
        while walker is not None and walker.item()._value != val:
            walker = self._data.after(walker)
        return walker

    def _move_up(self, p):
        if p != self._data.first():
            walker = self._data.before(p)
            cnt = p.item()._count
            if cnt > walker.item()._count:
                while walker != self._data.first() and cnt > self._data.before(walker).item()._count:
                    walker = self._data.before(walker)

                self._data.add_before(self._data.delete(p), walker)

    """ public methods"""
    def __len__(self):
        return len(self._data)

    def is_empty(self):
        return len(self._data) == 0

    def access(self, val):
        p = self._find_position(val)
        if p is None:
            p = self._data.add_last(self._Item(val))
        p.item()._count += 1
        self._move_up(p)

    def access_item(self, item):
        val = item._value
        p = self._find_position(val)
        if p is None:
            p = self._data.add_last(item)
        self._move_up(p)

    def remove(self, val):
        p = self._find_position(val)
        if p is not None:
            self._data.delete(p)

    def top(self, k):
        if not 1 <= k <= len(self):
            raise ValueError('Illegal value for k')
        walker = self._data.first()
        for i in range(k):
            yield walker.item()._value
            walker = self._data.after(walker)
예제 #27
0
class FavoritesList:
    """
    List of elements ordered from most frequently accessed to least.
    """

    #------------------------------ nested Item class ------------------------------
    class _Item:
        __slots__ = '_value', '_count'

        def __init__(self, e):
            self._value = e
            self._count = 0

    #------------------------------- nonpublic utilities -------------------------------
    def _find_position(self, e):
        """
        Search for element e and return its Position (or None if not found).
        :param e:
        :return:
        """
        walk = self._data.first()
        while walk is not None and walk.element()._value != e:
            walk = self._data.after(walk)
        return walk

    def _move_up(self, p):
        """
        Move item at Position p earlier in the list based on access count.
        :param p:
        :return:
        """
        if p != self._data.first():
            cnt = p.element()._count
            walk = self._data.before(p)
            if cnt > walk.element()._count:
                while (walk != self._data.first()
                       and cnt > self._data.before(walk)._count):
                    walk = self._data.before(walk)
                self._data.add_before(walk, self._data.delete(p))

    #------------------------------- public methods -------------------------------

    def __init__(self):
        """
        Create an empty list of favorites.
        :return:
        """
        self._data = PositionalList()

    def __len__(self):
        """
        Return number of entries on favorites list.
        :return:
        """
        return len(self._data)

    def is_empty(self):
        """
        Return True is list is empty.
        :return:
        """
        return len(self._data) == 0

    def access(self, e):
        """
        Access element e,thereby increasing its access count.
        :param e:
        :return:
        """
        p = self._find_position(e)
        if p is None:
            p = self._data.add_last(self._Item(e))
        p.element()._count += 1
        self._move_up(p)

    def remove(self, e):
        """
        Remove element e from the list of favorites
        :param e:
        :return:
        """
        p = self._find_position(e)
        if p is not None:
            self._data.delete(p)

    def top(self, k):
        """
        Generate sequence of top k elements in terms of access count.
        :param e:
        :return:
        """
        if not 1 <= len(self):
            raise ValueError('Illegal value for k')
        walk = self._data.first()
        for j in range(k):
            item = walk.element()
            yield item._value
            walk = self._data.after(walk)
class UnsortedPriorityQueue(PriorityQueueBase):
    """
    a min-oriented priority queue implemented with an unsorted list
    """

    # base class defines _Item

    def _find_min(self):  # nonpublic utility
        """
        return Position of item with minimum key
        :return:
        """
        if self.is_empty():
            raise Empty('priority queue is empty')
        small = self._data.first()
        walk = self._data.after(small)
        while walk is not None:
            if walk.element() < small.element():
                small = walk
            walk = self._data.after(walk)
        return small

    def __init__(self):
        """
        create a new empty Priority Queue
        """
        self._data = PositionalList()

    def __len__(self):
        """
        return the number of items in the priority queue
        :return:
        """
        return len(self._data)

    def add(self, key, value):
        """
        add a key-value pair
        :param key:
        :param value:
        :return:
        """
        self._data.add_last(self._Item(key, value))

    def min(self):
        """
        return but do not remove (k,v) pair with minimum key
        :return:
        """
        p = self._find_min()  # return the position
        item = p.element()
        return (item._key, item._value)

    def remove_min(self):
        """
        remove and return (k,v) pair with minimum key
        :return:
        """
        p = self._find_min()  # return the position
        item = self._data.delete(p)
        return (item._key, item._value)
in nondecreasing order, and another value V, and determines in O(n) time
if there are two elements of L that sum precisely toV. The function should
return a pair of positions of such elements, if found, or None otherwise
"""

from PositionalList import PositionalList


def find_pair(l, v):
    start, end = l.first(), l.last()
    while 1:
        start_val, end_val = start.element(), end.element()
        if end_val > v:
            end = l.before(end)
        elif end_val + start_val < v:
            start = l.after(start)
            if start is None:
                return None
        elif end_val + start_val > v:
            return None
        else:
            print('its a match', end_val, start_val)
            return end_val, start_val


a = PositionalList()
for b in range(0,100,3):
    a.add_last(b)


find_pair(a, 33)
    pp.add_first(random.randint(0, 100))
print(pp)
rp = reversed(pp)
for i in rp: print(i, end=" ")
print()


# R-7.16
# Describe an implementation of the PositionalList methods add last and
# add before realized by using only methods in the set {is empty, first, last,
# prev, next, add after, and add first} .
pp = PositionalList()
pp.add_last2(500)
for _ in range(5):
    pp.add_first(random.randint(0, 3))
pp.add_last(1000); print(pp)
pp.add_last2(2000); print(pp)
pp.add_before(pp.first(), 3000); print(pp)
pp.add_before2(pp.first(), 4000); print(pp)
pp.add_before2(pp.last(), 5000); print(pp)


# R-7.17
# move an element of a list at position p to become the first
# element of the list, while keeping the relative order of the remaining elements
# unchanged.
# Augment the PositionalList
# class to support a new method, move to front(p), that accomplishes this
# goal more directly, by relinking the existing node.
pp = PositionalList()
for i in range(5):
예제 #31
0
        add() takes O(nlogn)
        remove_min() takes O(nlogn)

        Total Running Time = O(nlogn)

        Improvements : use Bottom-up heap construction to reduce
        phase 1 running time to O(n)
        """
        if not isinstance(c, PositionalList):
            raise TypeError('Must pass positional list')
        n = len(c)
        P = HeapPriorityQueue()
        for j in range(n):
            element = c.delete(c.first())
            P.add(element, element)
        for j in range(n):
            (k, v) = P.remove_min()
            c.add_last(v)

if __name__ == '__main__':
    sorter = PriorityQueueSort()
    l = PositionalList()
    l.add_last(4)
    l.add_last(3)
    l.add_last(5)
    l.add_last(1)
    l.add_last(2)

    print('Unsorted list is ', l)
    sorter.pq_selection_sort(l)
    print('Sorted list is ', l)
class FavoritesList:
    """List of elements ordered from most frequently accessed to least."""

    # ------------------------------ nested _Item class ------------------------------
    class _Item:
        __slots__ = '_value', '_count'  # streamline memory usage

        def __init__(self, e):
            self._value = e  # the user's element
            self._count = 0  # access count initially zero

    # ------------------------------- nonpublic utilities -------------------------------
    def _find_position(self, e):
        """Search for element e and return its Position (or None if not found)."""
        walk = self._data.first()

        while walk is not None and walk.element()._value != e:
            walk = self._data.after(walk)
        return walk

    def _move_up(self, p):
        """Move item at Position p earlier in the list based on access count."""
        if p != self._data.first():  # consider moving...
            cnt = p.element()._count
            walk = self._data.before(p)
            if cnt > walk.element()._count:  # must shift forward
                while (walk != self._data.first()
                       and cnt > self._data.before(walk).element()._count):
                    walk = self._data.before(walk)
                self._data.add_before(walk,
                                      self._data.delete(p))  # delete/reinsert

    # ------------------------------- public methods -------------------------------
    def __init__(self):
        """Create an empty list of favorites."""
        self._data = PositionalList()  # will be list of _Item instances

    def __len__(self):
        """Return number of entries on favorites list."""
        return len(self._data)

    def is_empty(self):
        """Return True if list is empty."""
        return len(self._data) == 0

    def access(self, e):
        """Access element e, thereby increasing its access count."""
        p = self._find_position(e)  # try to locate existing element
        if p is None:
            p = self._data.add_last(self._Item(e))  # if new, place at end
        p.element()._count += 1  # always increment count
        self._move_up(p)  # consider moving forward

    def remove(self, e):
        """Remove element e from the list of favorites."""
        p = self._find_position(e)  # try to locate existing element
        if p is not None:
            self._data.delete(p)  # delete, if found

    def top(self, k):
        """Generate sequence of top k elements in terms of access count."""
        if not 1 <= k <= len(self):
            raise ValueError('Illegal value for k')
        walk = self._data.first()
        for j in range(k):
            item = walk.element()  # element of list is _Item
            yield item._value  # report user's element
            walk = self._data.after(walk)

    def __repr__(self):
        """Create string representation of the favorites list."""
        return ', '.join('({0}:{1})'.format(i._value, i._count)
                         for i in self._data)
예제 #33
0
class FavoritesList:
    """List of elements ordered from most frequently accessed to least."""

    #------------------------------ nested Item class ------------------------------
    class _Item:
        __slots__ ='_value','_count'# streamline memory usage
        def __init__ (self, e):
            self._value = e # the user s element
            self._count = 0 # access count initially zero

    #------------------------------- nonpublic utilities -------------------------------
    def _find_position(self, e):
        """Search for element e and return its Position (or None if not found)."""
        walk = self._data.first()
        while walk is not None and walk.element()._value != e:
            walk = self._data.after(walk)
        return walk

    def _move_up(self, p):
        """Move item at Position p earlier in the list based on access count."""
        if p != self._data.first(): # consider moving...
            cnt = p.element()._count
            walk = self._data.before(p)
            if cnt > walk.element()._count: # must shift forward
                while (walk != self._data.first() and
                        cnt > self._data.before(walk).element()._count):
                    walk = self._data.before(walk)
                self._data.add_before(walk, self._data.delete(p)) # delete/reinsert
    #------------------------------- public methods -------------------------------
    def __init__ (self):
        """Create an empty list of favorites."""
        self._data = PositionalList() # will be list of Item instances

    def __iter__(self):
        """Generate a forward iteration of the elements of the list."""
        for i in self._data:
            yield i

    def __reversed__(self):
        """Generate a backward iteration of the elements of the list."""
        for i in reversed(self._data):
            yield i

    def __len__(self):
        """Return number of entries on favorites list."""
        return len(self._data)

    def is_empty(self):
        """Return True if list is empty."""
        return len(self._data) == 0

    def access(self, e):
        """Access element e, thereby increasing its access count."""
        p = self._find_position(e) # try to locate existing element
        if p is None:
            p = self._data.add_last(self._Item(e)) # if new, place at end
        p.element()._count += 1 # always increment count
        self._move_up(p) # consider moving forward

    def remove(self, e):
        """Remove element e from the list of favorites."""
        p = self._find_position(e) # try to locate existing element
        if p is not None:
            self._data.delete(p) # delete, if found

    def top(self, k):
        """Generate sequence of top k elements in terms of access count."""
        if not 1 <= k <= len(self):
            raise ValueError('Illegal value for k')
        walk = self._data.first()
        for j in range(k):
            item = walk.element() # element of list is Item
            yield item._value # report user’s element
            walk = self._data.after(walk)

    def clear(self):
        """Clean the list into empty"""
        self._data = PositionalList() # will be list of Item instances

    def reset_count(self):
        """Reset the count of element in list leaving the order unchanged"""
        for i in self:
            i._count = 0

    def showinfo(self):
        """Show the infomation of the current list"""
        print 'Favoriteslist info:[',
        for i in self:
            print '(',i._value,',',i._count,')',
        print ']'

    def showelement(self):
        """Show the element of the current list"""
        print 'Favoriteslist elements:[',
        for i in self:
            print i._value,
        print ']'