Python 数据结构与算法分析 一、栈与队列

数据结构性能

1、大O记法

如果将每一步看成基本计算单位,那么可以将算法的执行时间描述成解决问题所需的步骤数。
对于累加算法,计算总和所用的赋值语句的数目就是一个很好的基本计算单位。

在函数中,赋值语句数是1加上n的运行次数。可以将其定义成函数T,令T(n) = 1 + n,参数n常被称作问题规模
可以将函数解读为“当问题规模为n时,解决问题所需的时间是T(n) ,即需要1 + n步”

精确的步骤数并没有T(n) 函数中取决定性作用的部分重要。也就是说,随着问题规模的增长,T(n) 函数的某一部分会比其余部分增长得更快
最后比较的其实就是这一起决定作用的部分。

数量级函数描述的就是,当n增长是,T(n) 增长最快的部分。
数量级(order of magnitude)常被称作大O记法,记作O(f(n))

对于T(n) = 1 + n,随着n越来越大,常数1对最终结果的影响越来越小。
如果要给出T(n)的近似值,可以舍去1,直接说执行时间是O(n)

def sumOFN(n):
	theSum = 0
	for i in range(1, n+1)
		theSum = theSum + i
	return theSum

基本数据结构

1、线性数据结构

栈、队列、双端队列和列表都是有序的数据集合,其元素的顺序取决于添加顺序和移除顺序。
一旦某个元素被添加进来,它与前后元素的相对位置将保持不变。这样的数据集合经常被称为线性数据结构

2、栈:LIFO (last-in first-out)

栈的Python实现

1)列表尾部作为栈的顶端

class Stack:
    def __init__(self):
        self.items = []
    
    def isEmpty(self):
        return self.items == []
    
    def push(self, item):
        self.items.append(item)
    
    def pop(self):
        return self.items.pop()

    def peek(self):
        return self.items[len(self.items)-1]

    def size(self):
        return len(self.items)

2) 列表头部作为栈的顶端

class Stack:
    def __init__(self):
        self.items = []
    
    def isEmpty(self):
        return self.items == []
    
    def push(self, item):
        self.items.insert(0, item)
    
    def pop(self):
        return self.items.pop(0)

    def peek(self):
        return self.items[0]

    def size(self):
        return len(self.items)

3)模块实现

from pythonds.basic import Stack

使用栈解决问题

匹配括号

编写一个算法,它从左到右读取一个括号串,然后判断其中的括号是否匹配

from pythonds.basic import Stack

inp1 = "((()()))(()))"
inp2 = "((()())(()))"

def detect(string):
    s = Stack()
    for i in string:
        if i == "(":
            s.push(i)
        else:
            try:
                s.pop()
            except IndexError:
                return False
    return True
    
print(detect(inp1))
print(detect(inp2))

3、队列:FIFO(first-in first-out)

队列的Python实现

在列表头部添加元素,在列表尾部移出元素

class Stack:
    def __init__(self):
        self.items = []
    
    def isEmpty(self):
        return self.items == []
    
    def enqueue(self, item):
        self.items.insert(0, item)
    
    def dequeue(self):
        return self.items.pop()

    def size(self):
        return len(self.items)

串土豆程序

from pythonds.basic import Queue

def hotPotato(namelist, num):
    q = Queue()
    for i in name:
        q.enqueue(i)

    # 当队列只剩一个元素时结束循环
    while q.size() > 1:
        # 循环num次
        for i in range(num):
            # 将从尾部移除的元素添加到头部
            q.enqueue(q.dequeue())
        # 移除头部元素
        q.dequeue()
    return q.dequeue()

print(hotPotato(["1","2","3","4","5","6"], 7))

4、双端队列

双端队列对在哪一端添加和移除元素没有任何限制

双端队列的Python实现

class Deque:
    def __init__(self):
        self.items = []

    def isEmpty(self):
        return self.items == []

    def addFront(self, item):
        self.items.append(item)

    def addRear(self, item):
        self.items.insert(0, item)

    def removeFront(self):
        return self.items.pop()

    def removeRear(self):
        return self.items.pop(0)

    def size(self):
        return len(self.items)

列表

实现无续的列表:链表

无序列表需要维持元素之间的相对位置,但是并不需要在连续的内存空间中维护这些位置信息。

结点的Python实现

class Node:
    def __init__(self, initdata):
        self.data = initdata
        self.next = None

    def getData(self):
        return self.data

    def getNext(self):
        return self.next
    
    def setData(self, newdata):
        self.data = newdata
    
    def setNext(self, newnext):
        self.next = newnext

链表的Python实现、

链表其实是由一个个结点组成的。

class UnorderList:
    def __init__(self):
        self.head = None

    def isEmpty(self):
        return self.head == None

    def add(self, item):
        temp = Node(item)
        temp.setNext(self.head)
        self.head = temp

    def pop(self):
        current = self.head
        if current != None:
            previous = current
            self.head = current.getNext()
            return previous.getData()

    def length(self):
        current = self.head
        count = 0
        while current != None:
            count = count + 1
            current = current.getNext()
        return count

    def search(self, item):
        current = self.head
        found = False
        while current != None and not found:
            if current.getData() == item:
                found = True
            else:
                current = current.getNext()
        return found

    def remove(self, item):
        current = self.head
        previous = None
        found = False
        while not found:
            if current.getData() == item:
                found = True
            else:
                previous = current
                current = current.getNext()

        if previous == None:
            self.head = current.getNext()
        else:
            previous.setNext(current.getNext())

猜你喜欢

转载自blog.csdn.net/Winds_Up/article/details/112582314