IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> python-数据结构 -> 正文阅读

[数据结构与算法]python-数据结构

数组和链表

数组特点

1.连续:顺序存储。
2.定长:一旦定义后,长度不可变。
3.根据下标可直接访问到这个下标的元素。
4.不适合做插入删除等操作。

python中,list列表为动态数组

链表特点

1.可以不连续。
2.不定长。
3.无法根据下标去直接访问,必须从头一个一个往后找。
4.适合做插入删除等操作。

队列和栈

队列

队列特点
1.先进先出
2.只能从队列末尾插入数据
3.只能从队列头部取出数据

class Queue(object):
    def __init__(self):
        self.data_list = []

    def init_queue(self):
        self.data_list = []

    def insert(self, data):
        self.data_list.append(data)

    def pop(self):
        if len(self.data_list) == 0:
            return None
        data = self.data_list[0]
        del self.data_list[0]
        return data

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

queue = Queue()
print(queue.size())
queue.insert(1)
queue.insert(2)
queue.insert(3)
head = queue.pop()
print(head)
head = queue.pop()
print(head)
head = queue.pop()
print(head)
head = queue.pop()
print(head)

栈特点
1.后进先出。
2.只能从尾部插入数据。
3.只能从尾部取出数据。

class Stack(object):
    def __init__(self):
        self.data_stack = []

    def init_Stack(self):
        self.data_stack = []

    def insert(self, data):
        self.data_stack.append(data)

    def pop(self):
        if len(self.data_stack) == 0:
            return None
        data = self.data_stack[-1]
        del self.data_stack[-1]
        return data

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

stack = Stack()
stack.insert(1)
stack.insert(2)
stack.insert(3)
tail = stack.pop()
print(tail)
tail = stack.pop()
print(tail)
tail = stack.pop()
print(tail)
tail = stack.pop()
print(tail)

多棵树组成森林。

二叉树

二叉树是每个节点最多有两个子节点的树。
在这里插入图片描述

前序遍历(根左右)

前序遍历顺序:
[1, 2, 5, 6, 3, 7, 8, 9]

中序遍历(左根右)

中序遍历顺序:
[5, 2, 6, 1, 8, 7, 9, 3]

后序遍历(左右根)

后序遍历顺序:
[ 5, 6, 2, 8, 9, 7, 3, 1]

python实现二叉树

class Node(object):
    def __init__(self, index):
        self.index = index
        self.left_child = None
        self.right_child = None

class BinaryTree(object):
    def __init__(self, root):
        self.root = root
# 前序
    def pre_travel(self, node):
        if not node:
            return
        print(node.index)
        self.pre_travel(node.left_child)
        self.pre_travel(node.right_child)
# 中序
    def inner_travel(self, node):
        if not node:
            return
        self.inner_travel(node.left_child)
        print(node.index)
        self.inner_travel(node.right_child)
# 后序
    def order_travel(self, node):
        if not node:
            return
        self.order_travel(node.left_child)
        self.order_travel(node.right_child)
        print(node.index)

if __name__ == '__main__':
    node_dict = {}
    for i in range(1, 10):
        node_dict[i] = Node(i)
    node_dict[1].left_child = node_dict[2]
    node_dict[1].right_child = node_dict[3]
    node_dict[2].left_child = node_dict[5]
    node_dict[2].right_child = node_dict[6]
    node_dict[3].left_child = node_dict[7]
    node_dict[7].left_child = node_dict[8]
    node_dict[7].right_child = node_dict[9]

    tree = BinaryTree(node_dict[1])
    tree.pre_travel(node_dict[1])
    tree.inner_travel(node_dict[1])
    tree.order_travel(node_dict[1])

排序

排序算法

插入排序

原始数组插入到新的(sorted)数组

冒泡排序

交换

快速排序(最经典)

选一个标杆值

def quick_sort(origin_list, start, end):
    if start >= end:
        return
    left = start
    right = end
    flag_index = left
    while left < right:
        while right > left:
            if origin_list[right] < origin_list[flag_index]:
                origin_list[right], origin_list[flag_index] = origin_list[flag_index], origin_list[right]
                flag_index = right
                break
            right -= 1
        while left < right:
            if origin_list[left] > origin_list[flag_index]:
                origin_list[left], origin_list[flag_index] = origin_list[flag_index], origin_list[left]
                flag_index = left
                break
            left += 1
    quick_sort(origin_list, start, flag_index)
    quick_sort(origin_list, flag_index + 1, end)

origin_list = [5, 3, 1, 7, 9, 8]
quick_sort(origin_list, 0, len(origin_list) - 1)
print(origin_list)

归并排序

每次均分成两份,一生二,二生四,四升八,把每份排序,然后归并在一起。

二分查找

python实现二分查找

def binary_search(search_list, target):
    left = 0
    right = len(search_list) - 1
    while left <= right:
        mid = left + (right-left) // 2
        if search_list[mid] < target:
            left = mid + 1
            continue
        if search_list[mid] == target:
            return mid
        if search_list[mid] > target:
            right = mid - 1
    return None

search_list = [1, 3, 4, 6, 8, 9]
print(binary_search(search_list, 5))
print(binary_search(search_list, 1))
print(binary_search(search_list, 3))
print(binary_search(search_list, 4))
print(binary_search(search_list, 6))
print(binary_search(search_list, 8))
print(binary_search(search_list, 9))

堆特点

1.堆是一个二叉树。
2.叶子节点只存在最下面两层。
3.从根节点到倒数第二层,是一个完全二叉树。
4.一个节点不可能只有右孩子。
5.一个节点的左孩子和右孩子都比这个节点大(或者小)
例如–大顶堆:
在这里插入图片描述

堆 python实现

class Heap(object):
    def __init__(self):
        self.data_list = [None]

    def size(self):
        return len(self.data_list) - 1

    def left_child(self, root):
        return root * 2

    def right_child(self, root):
        return root * 2 + 1

    def father(self, node):
        return node // 2

    # 维护堆状态
    def heapify(self, root):
        if root > self.size():
            return
        left_node = self.left_child(root)
        right_node = self.right_child(root)
        largest = root
        if left_node <= self.size():
            if self.data_list[left_node] >self.data_list[largest]:
                largest = left_node

        if right_node <= self.size():
            if self.data_list[right_node] > self.data_list[largest]:
                largest = right_node

        if largest != root:
            self.data_list[root], self.data_list[largest] = self.data_list[largest], self.data_list[root]
            self.heapify(largest)

    # 建堆(最后一个非叶子节点在堆的大小除以二的地方)
    def build_heap(self):
        for i in range(self.size()//2, 0, -1):
            self.heapify(i)

    # 取堆顶
    def get_max(self):
        if self.size() == 0:
            return None
        ret = self.data_list[1]
        self.data_list[1] = self.data_list[-1]
        del self.data_list[-1]
        self.heapify(1)
        return ret

    def insert(self, data):
        self.data_list.append(data)
        now_index = self.size()
        pre = self.father(now_index)
        while now_index != 1 and self.data_list[pre] < data:
            self.data_list[pre], self.data_list[now_index] = self.data_list[now_index], self.data_list[pre]
            now_index = pre
            pre = self.father(now_index)

if __name__ == '__main__':
    heap = Heap()
    heap.insert(9)
    heap.insert(10)
    heap.insert(7)
    heap.insert(12)
    heap.insert(3)
    heap.insert(4)
    print(heap.get_max())
    print(heap.get_max())
    print(heap.get_max())
    print(heap.get_max())
    print(heap.get_max())
    print(heap.get_max())
    print(heap.get_max())
    heap.insert(10)
    heap.insert(9)
    heap.insert(8)
    heap.insert(7)
    heap.insert(7)
    heap.insert(12)
    print(heap.get_max())
    heap.data_list = [None, 1, 2, 3, 4, 5, 6, 7]
    heap.build_heap()
    print(heap.get_max())

运行结果
在这里插入图片描述

  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2022-03-08 22:48:16  更:2022-03-08 22:51:53 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 13:27:51-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码