美文网首页
数据结构

数据结构

作者: 不羁者的璀璨星空丶 | 来源:发表于2020-05-22 14:21 被阅读0次

数据结构

1. 栈

  • 先进后出
  • 栈顶,栈底
  • 应用:浏览器的后退按钮

实现一个栈:

  • Stack() 创建一个新的空栈。
  • push(item) 添加一个元素item到栈顶。无返回值。
  • pop() 从栈顶删除一个元素。返回该元素。
  • peek() 获取栈顶的元素,不改变栈的结构。
  • isEmpty() 判断该栈是否为空。
  • size() 返回栈的元素个数。

代码实现:

class Stack():
    def __init__(self):
        self.items = []
    def push(self,item):
        """添加一个元素item到栈顶"""
        self.items.append(item)
    def pop(self):
        """从栈顶删除一个元素并返回"""
        return self.items.pop()
    def peek(self):
        """获取栈顶的元素"""
        return self.items[-1]
    def isEmpty(self):
        """判断栈是否为空"""
        return self.items == []
    def size(self):
        """获取栈的元素个数"""
        return len(self.items)

2. 队列

  • 先进先出
  • 应用:需要排队的任务。

实现一个队列:

  • Queue() 创建一个新的空队列。
  • enqueue(item) 添加一个元素item到队尾。
  • dequeue() 从队首移除一个元素。并返回item。
  • isEmpty() 判断队列是否为空。
  • size() 获取队列的长度。

代码实现:

class Queue():
    def __init__(self):
        self.items = []
    def enqueue(self,item):
        """向对尾插入一个元素item"""
        self.items.insert(0,item)
    def dequeue(self):
        """从队尾删除一个元素"""
        return self.items.pop()
    def isEmpty(self):
        """判断队列是否为空"""
        return self.items == []
    def size(self):
        """获取队列的长度"""
        return len(self.items)

3. 链表

  • 一种线性表。
  • 不像顺序表一样连续存储数据,而是每一个节点(数据存储单元)存储数据和存储下一个节点的地址。

实现一个链表:

  • Node() 创建一个新的空节点。
  • Link() 封装一个链表结构。
  • add() 新增一个链表节点。
  • append(item) 链表尾部添加节点item。
  • insert(item,index) 把节点item插入到指定的index下标处。
  • travel() 遍历整个链表。
  • length() 获取链表的长度。
  • remove(item) 删除节点
  • search(item) 查找节点是否存在。
  • isEmpty() 判断链表是否为空。

代码实现:

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

class Link():
    def __init__(self):
        self._head = None

    def add(self,item):
        """新增一个链表节点"""
        node = Node(item)
        if self._head == None:
            self._head = node
            return
        node.next = self._head
        self._head = node

    def append(self,item):
        """链表尾部添加节点item"""
        node = Node(item)
        cur = self._head
        pre = None 
        while cur:
            pre = cur
            cur = cur.next
        pre.next = node

    def travel(self):
        cur = self._head
        while cur:
            print(cur.item)
            cur = cur.next

    def search(item):
        isFind = False
        cur = self._head
        while cur:
            if cur.item == item:
                isFind = True
        return isFind

    def length(self):
        cur = self._head
        num = 0
        while cur:
            num += 1
            cur = cur.next
        return num
    def isEmpty(self):
        return self._head.item == None

    def insert(self,item,index):
        """向指定的位置index,插入节点item"""
        node = Node(item)
        cur = self._head
        point = 0
        if index <= 0:
            self.add(item)
        elif index >= self.length():
            self.append(item)
        else:
            while cur:
                pre = cur
                cur = cur.next
                if point == index - 1:
                    node.next = cur
                    pre.next = node
                point += 1
    
    def remove(self,item):
        cur = self._head
        pre = None
        if self.search(item):
            if cur.item == item:
                self._head = cur.next
                return
            while cur:
                pre = cur
                cur = cur.next
                if cur.item == item:
                    pre.next = cur.next
                    cur.next = None
                    break


link = Link()
link.add(1)
link.add(2)
link.add(3)
link.add(4)
link.add(5)
link.append(6)
link.travel()
print(link.search(6))
print(link.isEmpty())
print(link.length())
link.insert(200,4)
print(link.search(200))
link.travel()
print("===========")
link.remove(200)
link.travel()

3. 二叉树

  • 节点:
    • 数值:保存节点数据
    • left:指向左叶子节点
    • right:指向右叶子节点
  • 跟节点:
    • 最上层的一个节点叫做跟节点

定义一个二叉树:

  • Node() 创建一个节点。
  • Tree() 封装一个二叉树。
  • insert(item) 向二叉树中插入数据。
  • travel() 遍历二叉树。
class Node():
    def __init__(self,item):
        self.item = item
        self.left = None
        self.right = None

class Tree():
    def __init__(self):
        self.root = None
    def insert(self,item):
        node = Node(item)
        if self.root == None:
            self.root = node
            return
        cur = self.root
        node_list = [cur]
        while True:
            node_pop = node_list.pop(0)
            if node_pop.left == None:
                node_pop.left = node
                break
            else:
                node_list.append(node_pop.left)
            if node_pop.right== None:
                node_pop.right= node
                break
            else:
                node_list.append(node_pop.right)
    def travel(self):
        cur = self.root
        node_list = [cur]
        while node_list:
            node_pop = node_list.pop(0)
            print(node_pop.item)
            if node_pop.left != None:
                node_list.append(node_pop.left)
            if node_pop.right != None:
                node_list.append(node_pop.right)

t = Tree()
t.insert(1)
t.insert(2)
t.insert(3)
t.insert(4)
t.insert(5)

t.travel()

查找算法

1. 顺序查找

  • 顺序查找原理剖析:
    • 从列表中的第一个元素开始,我们按照基本的顺序排序,简单地从一个元素移动到另一个元素,直到找到我们正在寻找的元素或遍历完整个列表。如果我们遍历完整个列表,则说明正在搜索的元素不存在。
def search(alist,item):
    isFind = False
    pos = 0
    while True:
        if alist[pos] == item:
            isFind = True
            break
        else:
            pos += 1
            if pos == len(alist):
                break
    return isFind
alist = [1,2,3,4,5,6,7,8,9]
print(search(alist,5))


2. 二分查找

  • 只作用于有序集合。
def search(alist,item):
    isFind = False
    left = 0
    right = len(alist) - 1
    while left <= right:
        mid = (left + right) // 2
        if item < alist[mid]:
            right = mid - 1
        elif item > alist[mid]:
            left = mid + 1
        else:
            isFind = True
            break
    return isFind

alist = [1,2,3,4,5,6,7,8,9]
print(search(alist,5))

排序算法

1. 冒泡排序

  • 相邻元素,两两比较,大的放后面。
def sort(item):
    for i in range(len(item)):
        for j in range(len(item)-i-1):
            if item[j] > item[j+1]:
                item[j],item[j+1] = item[j+1],item[j]
    return item

alist = [3,7,4,2,6,8,2,1,9]
print(sort(alist))
                

2. 选择排序

  • 每次遍历整个列表,选择最大的一个元素,和最后一个元素交换。每次遍历只交换一次数据。
def sort(item):
    for j in range(len(item)-1):
        max = 0
        for i in range(1,len(item)-j):
            if item[max] < item[i]:
                max = i
        item[max],item[len(item)-j-1] = item[len(item)-j-1],item[max]
    return item

            
alist = [3,7,4,2,6,8,2,1,9]
print(sort(alist))

3. 插入排序

  • 把列表当做两部分:有序部分和无序部分,每次取一个无序元素,和有序元素比较,插入到有序部分。
    • 有序部分:默认第一个元素是有序的
    • 无序部分:非第一个元素是无序的
    • 引入一个变量 i:表示有序元素的个数和无序元素的第一个元素下标
def sort(alist):
    for i in range(len(alist)):
        while i > 0:
            if alist[i] < alist[i-1]:
                alist[i],alist[i-1] = alist[i-1],alist[i]
                i -= 1
            else:
                break
    return alist

alist = [3,7,4,2,6,8,2,1,9]
print(sort(alist))

4. 希尔排序

  • 增量gap,初始值:元素个数整除2
    • gap表示分组的个数
    • gap表示每组数据的间隔
    • 然后每次用分组个数整除2获取新的gap值
  • 插入排序就是增量为1的希尔排序,可以处理大数据量的排序。
def sort(alist):
    gap = len(alist) // 2
    while gap > 0:
        for i in range(len(alist)):
            while i > 0:
                if alist[i] < alist[i-1]:
                    alist[i],alist[i-1] = alist[i-1],alist[i]
                    i -= 1
                else:
                    break
        gap //= 2
    return alist

alist = [3,7,4,2,6,8,2,1,9]
print(sort(alist))

5. 快速排序

  • 定义两个变量:
    • low:序列的最左边的元素
    • high:序列的最右边的元素
    1. 把列表的第一个元素赋值给基准数字mid变量,使基准值右边的值都大于mid,使左边的值都小于mid。
    1. 实现过程:
    • 移动high:用mid值和high值比较,若high值大于mid值,则high-1,否则把high值赋给low。
    • 移动low: 用mid值和low值比较,若low值小于mid值,则low+1,否则把low值赋给high。
  • 完成以上的逻辑之后,把mid左边的元素当做一个序列,右边的元素当做一个序列,然后重复上面的逻辑(使用递归实现)。
def sort(alist,start,end):
    low= start
    high= end

    if low > high:
        return

    mid = alist[low]
    while low < high:
        while low < high:
            if mid > alist[high]:
                alist[low] = alist[high]
                break
            else:
                high -= 1
        while low < high:
            if mid < alist[low]:
                alist[high] = alist[low]
                break
            else:
                low += 1
        if low == high:
            alist[low] = mid
            break
    
    sort(alist,start,high-1)
    sort(alist,low+1,end)
    
    return alist

alist = [5,7,8,3,2,1,4,6,9]
sort(alist,0,len(alist)-1)
                

相关文章

  • IOS开发_数据结构

    1、数据结构; 2、算法; 3、数据结构与算法; 1、数据结构; 1.1 概念: 数据结构:数据结构是计算...

  • py基础

    5Python集合容器 数据结构数据结构 一般将数据结构分为两大类: 线性数据结构和非线性数据结构。 线性数据结构...

  • 思维导图之数据结构+算法

    数据结构+算法 = 程序 数据结构比较 参考文章 数据结构与算法数据结构与算法(java)

  • 数据结构与算法分析:大纲]

    00数据结构与算法分析:大纲01数据结构:数组02数据结构:链表03数据结构:栈03数据结构:队列 本系列课程主要...

  • 数据结构:数组

    00数据结构与算法分析:大纲01数据结构:数组02数据结构:链表03数据结构:栈03数据结构:队列 数组 数组是一...

  • 数据结构—概述

    数据结构概述 数据结构概述:程序设计 = 数据结构 + 算法数据结构:数据元素之间存在所有特定关系的集合,数据结构...

  • OVS 源码分析整理

    OVS 核心代码 OVS 架构 OVS 主要的数据结构数据结构关系图主要的数据结构和数据结构的参数数据结构代码 d...

  • 01. 数据结构与算法绪论

    一、数据结构 1. 什么是数据结构 2. 数据结构的分类 3. 常用的数据结构 4. 数据结构的应用表现 二、算法...

  • 数据结构与算法 - 查找

    数据结构与算法系列文章数据结构与算法 - 时间复杂度数据结构与算法 - 线性表数据结构与算法 - 树形结构数据结构...

  • C#之数据结构(上)

    数据结构 一般将数据结构分为两大类: 线性数据结构和非线性数据结构。 线性数据结构有: 线性表、栈、队列、串、数组...

网友评论

      本文标题:数据结构

      本文链接:https://www.haomeiwen.com/subject/leuqahtx.html