zoukankan      html  css  js  c++  java
  • 【数据结构与算法】

    数据结构与算法概述

    数据结构的定义

    我们如何把现实中大量而且非常复杂的问题以特定的数据类型(个体)和特定的存储结构(个体的关系)保存到相应的主存储器(内存)中,以及在此基础上为实现某个功能而执行的相应操作,这个相应的操作也叫做算法。
    

    数据结构 == 个体 + 个体关系

    算法 == 对存储数据的操作

    数据结构的特点

    数据结构是软件中最核心的课程。
    

    程序 = 数据的存储 + 数据的操作 + 可以被计算机执行的语言。

    算法

    衡量算法的标准

    • 时间复杂度 指的是大概程序执行的次数,而非程序执行的时间。
    • 空阿金复杂度 值得是程序执行过程中,大概缩占用的最大内存。
    • 难易程度
    • 健壮性

    需要熟练掌握的算法

    常见的排序

    • 冒泡排序
    • 选择排序
    • 插入排序
    • 快速排序
    • 归并排序
    • 希尔排序
    • 计数排序
    • 二分法查找元素

    常见的查找

    • 顺序查找
    • 二分法查找

    其他的算法

    • 贪心算法
    • 递归算法

    线性结构

    比较通俗的讲,把所有的节点用一根线串起来的结构就称之为线性结构。线性结构分为两种方式:数组、链表。
    

    数组与链表的区别

    数组需要一块连续的内存空间来存储,堆内存的要求比较高。如果我们申请一个100M大小的数组,当内存中没有连续的、足够大的空间时,即使内存的剩余可用空间大于100M,任然会申请失败。而链表恰恰相反,它并不需要一块连续的内存空间,他通过“指针”将一组零散的内存块串联起来使用,所以申请的是大小是100M的链表,name根本不会有问题。
    

    1558612288328

    连续存储(数组)

    数组,在python语言中成为列表,是一种基本的数据结构类型。
    

    列表的优缺点

    • 优点:
      • 存取速度快
    • 缺点:
      • 事先需要知道数组的长度
      • 需要大块的连续内存
      • 插入删除非常的慢,效率极低

    注:列表的其他问题,请百度python基础。

    离散存储(链表)

    链表的定义

    • n个节点离散分配
    • 彼此通过指针相连
    • 每个节点都有一个前驱节点,每个节点只有一个后续节点
    • 首节点没有前驱节点,尾节点没有后续节点

    链表的优缺点

    • 优点:
      • 空间没有限制,插入删除元素很快
    • 缺点:
      • 查询比较慢

    链表的结构

    链表的及诶单结构如下:

    1558612776787

    data为自定义的数据,next为下一个节点的地址。

    链表的专业术语

    • 首节点:第一个有效节点。
    • 尾节点:最后一个有效节点。
    • 头结点:第一个有效节点之前的那个节点,头结点并不存储任何数据,目的是为了方便对链表的操作。
    • 头指针:指向头结点的指针变量。(上图在头结点的左侧,未画出)
    • 尾指针:指向尾节点的指针变量。

    链表的分类

    • 单链表
    • 双链表 每一个节点有两个指针域
    • 循环链表 能通过任何一个节点找到其他所有的节点
    • 非循环列表

    链表的算法

    • 增加
    • 删除
    • 修改
    • 查找
    • 总长度

    Python语言实现单链表的增删查

    在Python语言中用面向对象组合的方式,代替指针指向,更加的方便,简单,容易理解。

    # Use The Linked List sort Liangshan Po 108 Heroes
    
    
    #
    class Hero():
        def __init__(self, no=None, name=None, nick_name=None, next=None):
            self.no = no
            self.name = name
            self.nick_name = nick_name
            self.next = next
    
    
    def add_hero(head, hero):
        current_position = head
        while current_position.next and hero.no > current_position.next.no:
            current_position = current_position.next
        hero.next = current_position.next
        current_position.next = hero
    
    
    def get_all(head):
        current_position = head
        while current_position.next:
            print("编号:%s,姓名:%s,外号:%s" % (
                current_position.next.no, current_position.next.name, current_position.next.nick_name))
            current_position = current_position.next
    
    
    def delete_hero(head, hero):
        current_position = head
        if current_position.next:
            while current_position.next and current_position.next.no < hero.no:
                current_position = current_position.next
            current_position.next = current_position.next.next
        else:
            print("链表为空")
    
    head = Hero()
    hero = Hero(1, '宋江', '及时雨')
    # hero1 = Hero(2, '卢俊义', '玉麒麟')
    # hero2 = Hero(3, '吴用', '智多星')
    # hero3 = Hero(5, '林冲', '豹子头')
    # hero4 = Hero(4, '公孙胜', '入云龙')
    # add_hero(head, hero)
    # add_hero(head, hero1)
    # add_hero(head, hero2)
    # add_hero(head, hero3)
    # add_hero(head, hero4)
    # get_all(head)
    
    print("---------------------")
    delete_hero(head, hero)
    get_all(head)
    

  • 相关阅读:
    利用Python获取文件类型
    删除目录和文件
    创建目录和空文件
    读取文件内容
    sort方法
    python实例5-表格打印
    ngx.lua中遇到的小问题
    mysql 更改自动增长字段值的重新设定
    全面讲解进程池原理
    测试工程师Docker基础
  • 原文地址:https://www.cnblogs.com/846617819qq/p/10914261.html
Copyright © 2011-2022 走看看