数据结构的python实现

  1. 可以比喻为上开口的树立储物柜
  2. python中借助于列表实现
  3. 先进后出
  4. 一种特殊的线性表,仅能在线性表的一段(栈顶)操作
  5. 常应用于实现递归方面的场景,例如非波那契数列
# python栈实现(必须会代码)
'''
初始化为空栈;
包含 判断为空,入栈,出栈(返回值,不返回值), 栈长功能;
注意添加,取出的操作都是在栈顶进行(列表末尾,运用append, pop函数);
'''
class satck(self):
	# 初始化为空
	def __init__(self):
		self.items = []
	
	# 判断是否为空,输出 True,False	
	def isEmpty(self):
		return self.items == []
	
	# 指定元素入栈
	def push(self, item):
		self.items.append(item)
	
	# 出栈
	def pop(self):
		self.items.pop()
	
	# 出栈(有返回值)
	def peek(self):
		return self.items.pop()

	# 返回栈长
	def size(self):
		return len(self.items)

队列

  1. 类似于排队,先进先出
  2. 也是一种线性表
  3. python中借助于列表实现
  4. 入队:列表一端实现;出队:python另一端实现
  5. 使用场景:多线程阻塞队列管理中非常适用
# python队列实现(必须会代码)
'''
初始化为空列表;
包含 清空,出队(pop),入队(insert),队列长 等功能;
注意出入在不同端实现;
'''
class Queue(self):
	# 初始化为空
	def __init__(self):
		self.items = []
	
	# 判断是否为空
	def isEmpty(self):
		return self.items == []
	
	# 指定元素入队
	def enqueue(self, item):
		self.items.insert(0, item)
	# 出队
	def dequeue(self):
		self.items.pop()
	# 返回队长
	def size(self):
		return len(self.items)
# python 双端队列实现(必须会代码)
"""
跟普通队列的区别在于可以两端都可以 出队,入队
"""
class Deque(self):
	# 初始化为空
	def __init__(self):
		self.items = []

	# 判断为空
	def isEmpty(self):
		return self.items == []

	# 指定元素队头入队
	def addFront(self, item):
		self.items.insert(0, item)
	# 队头出队
	def rmEnd(self):
		self.items.pop(0)
	# 指定元素队尾入队
	def addEnd(self, item):
		self.items.append(item)
	# 队尾出队
		self.items.pop()
	# 返回队长
	def size(self):
		return len(self.items)

二叉树

  1. 每个结点最多有两颗子树,结点的度最大为2
  2. 左子树和右子树是有顺序的,次序不能颠倒
  3. 即使某个结点只有一个子树,也要区分左右子树
# python二叉树实现(必须要会)
class BinaryTree:
	# 初始化二叉树
	def __init__(self, root):
		self.key = root
		self.left_child = None
		self.right_child = None
	
	# 从左插入指定新结点
	def insert_left(self, new_node)# 没有“左孩子”,你做我的左孩子
		if self.left_child == None:
			self.left_child = BinaryTree(new_node)
		# 有“左孩子”,我把我的左孩子给你,你再做我的左孩子
		else:
			t = BinayTree(new_code)
			t.left_child = self.left_child
			self.left_child = t
			
	# 从右插入指定新结点(原理同左)
		# 没有“右孩子”,你做我的右孩子
		def insert_right(self, new_node):
		if self.right_child = None:
			self.right_child = BinaryTree(new_node)
		else:
			t = BinaryTree(new_node)
			t.right_child = self.right_child
			self.right_child = t
	# 取左孩子
	def get_left_child(self):
		return self.left_child
		
	def get_right_child(self):
		return self.right_child
		
	# 设置根结点
	def set_root_val(self, val):
		self.key = val
	
	# 返回根结点
	def get_root_val(self):
		return self.key

  1. 堆是一颗完全二叉树
  2. 堆中的某个节点总不大于或者不小于其父节点的值。
  3. 大顶堆,小顶堆
# python 小顶堆实现(根结点为最小值),不要求掌握
class PriorityQueueBase:
    #抽象基类为堆
    class Item: 
        #轻量级组合来存储堆项目
        __slots__ = '_key' , '_value'

        def __init__ (self, k, v):
            self._key = k
            self._value = v

        def __lt__ (self, other):     #比较大小                                   
            return self._key < other._key

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

        def __str__(self):
            return str(self._key)
        

class HeapPriorityQueue(PriorityQueueBase):

    def __init__ (self):
        self._data = [ ]         

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

    def add(self, key, value):   #在后面加上然后加上
        self._data.append(self.Item(key, value)) 
        self._upheap(len(self._data) - 1)
        
    def min(self): 
        if self.is_empty():
            raise ValueError( "Priority queue is empty." )
        item = self._data[0]
        return (item._key, item._value)
    
    def remove_min(self):
        if self.is_empty():
            raise ValueError( "Priority queue is empty." )
        self._swap(0, len(self._data) - 1)
        item = self._data.pop( )
        self._downheap(0)
        return (item._key, item._value)

    def _parent(self, j): 
        return (j - 1) // 2
    
    def _left(self, j):
        return 2 * j + 1
    
    def _right(self, j):
        return 2 * j + 2

    def _has_left(self, j):
        return self._left(j) < len(self._data)
    
    def _has_right(self, j):
        return self._right(j) < len(self._data)      
    
    def _swap(self, i, j):
        self._data[i], self._data[j] = self._data[j], self._data[i]
        
    def _upheap(self, j):#往上交换
        parent = self._parent(j) 
        if j > 0 and self._data[j] < self._data[parent]: 
            self._swap(j, parent) 
            self._upheap(parent) 
    
    def _downheap(self, j):#往下交换,递归比较三个值
        if self._has_left(j):
            left = self._left(j)
            small_child = left
            if self._has_right(j):
                right = self._right(j) 
                if self._data[right] < self._data[left]:
                    small_child = right 
            if self._data[small_child] < self._data[j]:
                self._swap(j, small_child) 
                self._downheap(small_child)  


if __name__ == "__main__":
heap = HeapPriorityQueue()
heap.add(4, "D")
heap.add(3, "C")
heap.add(1, "A")
heap.add(5, "E")
heap.add(2, "B")
heap.add(7, "G")
heap.add(6, "F")
heap.add(26, "Z")

for item in heap._data:
    print(item)

print("min is: ")
print(heap.min())
print()

print("remove min: ")
print(heap.remove_min())
print("Now min is: ")
print(heap.min())
print()

print("remove min: ")
print(heap.remove_min())
print("Now min is: ")
print(heap.min())
print()

heap.add(1, "A")
print("Now min is: ")
print(heap.min())
print()

链表

链表的每个节点包含两个信息:

  1. 该节点的值
  2. 指向下一个节点的指针
class ListNode:
	def __init__(self, x):
		self.val = x
		self.next = None
单链表反转
'''
时间复杂度:O(n)  空间复杂度:O(1)
'''
def reverse_ListNode(head):
	if head == None or head.next = None:
		return head
	
	cur = head
	temp = None 
	newhead = None
	while cur:
		'''
		1+4: 取除头节点后面的链表赋值给自己
		1+2:取下头节点(逆序拼接,新链表指针引到原头节点,作为新链表的后面)
		1+3:换新head(其实是新链表的后面)
		'''
		temp = cur.next
		cur.next = newhead
		newhead = cur
		cur = temp
	return new_head
### 回答1: 在 Python ,你可以使用内置的 `sorted` 函数来对列表进行排序。例如: ```python numbers = [3, 4, 2, 1] sorted_numbers = sorted(numbers) print(sorted_numbers) # 输出: [1, 2, 3, 4] ``` 你也可以使用列表的 `sort` 方法来对列表进行排序。与 `sorted` 函数不同的是,`sort` 方法是在原地对列表进行排序,也就是说不会返回一个新的列表,而是直接修改原来的列表。例如: ```python numbers = [3, 4, 2, 1] numbers.sort() print(numbers) # 输出: [1, 2, 3, 4] ``` 你也可以使用 Python 的 heapq 库的堆排序算法。堆排序是一种速度较快的排序算法,特别适用于海量数据的排序。例如: ```python import heapq numbers = [3, 4, 2, 1] heapq.heapify(numbers) # 将列表转化为堆 sorted_numbers = [] while numbers: sorted_numbers.append(heapq.heappop(numbers)) # 将堆最小的数取出并放到结果列表 print(sorted_numbers) # 输出: [1, 2, 3, 4] ``` 此外,Python 还提供了许多其他的排序算法,例如快速排序、归并排序等。你可以使用 Python 的 timeit 库来对不同的排序算法进行测试,以找出最快的排序算法。 ### 回答2: 数据结构是计算机科学非常重要的一个概念,它是一种组织和存储数据的方式。而实现排序算法是数据结构一个重要应用。 在Python,可以使用多种数据结构实现排序算法,比如列表、数组和堆等。下面我将介绍一种常用的排序算法——插入排序的Python实现。 插入排序是一种简单且常用的排序算法,它的基本思想是将待排序的元素一个一个地按照大小插入到已经排好序的列表。具体步骤如下: 1. 创建一个新的空列表,作为存放已排序元素的容器。 2. 遍历待排序的列表,依次取出每个元素。 3. 将取出的元素与已排序元素的最后一个元素比较,如果取出的元素较小,则将它插入到已排序元素的末尾;如果取出的元素较大,则向前比较,找到合适的位置插入。 4. 重复步骤3,直到待排序列的所有元素都被取出并插入到已排序列。 5. 返回已排序的列表,即为排序结果。 下面是插入排序的Python实现代码: ```python def insertion_sort(arr): for i in range(1, len(arr)): key = arr[i] j = i - 1 while j >= 0 and arr[j] > key: arr[j + 1] = arr[j] j -= 1 arr[j + 1] = key return arr ``` 通过调用`insertion_sort`函数,传入待排序的列表,即可得到排序结果。 这就是数据结构一种常用排序算法——插入排序的Python实现。当然,除了插入排序,还有许多其他排序算法也可以使用Python实现,比如冒泡排序、快速排序等。每种排序算法都有其特点和适用场景,可以根据具体需求选择合适的排序算法来使用。 ### 回答3: 数据结构是计算机存储、组织和管理数据的方式。在Python,可以使用不同的数据结构实现排序算法。 常见的排序算法有冒泡排序、插入排序、选择排序、快速排序、堆排序和归并排序等。 冒泡排序是一种比较简单的排序算法,它重复地交换相邻的元素,直到整个序列有序为止。可以使用列表作为数据结构实现冒泡排序。 插入排序是一种较为直观的排序算法,它将未排序的元素逐个插入到已排序的部分,构建有序序列。也可以使用列表实现插入排序。 选择排序是一种简单直观的排序算法,它每次选择未排序部分的最小元素,并将其与未排序部分的最左边元素交换位置。同样可以使用列表来实现选择排序。 快速排序是一种常用的排序算法,它使用分治的思想,将序列分为两个子序列,递归地排序子序列。同样可以使用列表作为数据结构实现快速排序。 堆排序是一种利用堆的数据结构来进行排序的算法,它通过不断地构建和调整堆来达到排序的目的。可以使用列表来实现堆排序。 归并排序是一种稳定的排序算法,它使用分治的思想,将序列分为两个子序列,递归地排序子序列,然后将两个有序子序列合并为一个有序序列。同样可以使用列表来实现归并排序。 总的来说,Python提供了多种数据结构和算法来实现排序操作,根据实际需求和性能要求选择适合的算法和数据结构
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值