【python】数据结构与算法简介及单链表实现

news2024/11/17 0:07:30

数据结构和算法

简介:

​ 数据结构是存储和组织数据的一种方式,算法是位实现业务目的的各种方法和思路,作用是大大提升程序性能

1.算法的特性:

​ 1.独立性: 算法是独立存在的一种解决问题的方法和思想对于算法而言;实现的语言并不重要,重要的是思想;算法可以有不同的语言描述实现版本(如C描述、C++描述、Python描述等)

​ 2.算法的五大特性:
​ ①有输入
​ 算法具有0个或多个输入
​ ②有输出
算法至少有1个或多个输出
​ ③有穷性
算法在有限的步骤之后会自动结束而不会无限循环,并且每一个步骤可以在可接受的时间内完成
​ ④确定性
算法中的每一步都有确定的含义,不会出现二义性
​ ⑤可行性
算法的每一步都是可行的,也就是说每一步都能够执行有限的次数完成

时间复杂度介绍:

概述:

​ 它可以反应一个算法的优略,表示一个算法随着问题规模变化而表现出来的趋势

大O标记法:

​ 忽略次要条件,只考虑主要条件,就会得到时间和n(问题规模)的关系用O(n)表示

时间复杂度的的计算:

①基本操作
​ 时间复杂度为O(1)
②顺序结构
​ 时间复杂度按加法进行计算
③循环结构
​ 时间复杂度按乘法进行计算
④分支结构
​ 时间复杂度取最大值
⑤判断一个算法的效率时,往往只需要关注操作数量的最高次项,其它次要项和常数项可以忽略
⑥在没有特殊说明时,我们所分析的算法的时间复杂度都是指最坏时间复杂度
所消耗的时间从小到大,常见的时间复杂度关系有:

O(1) < O(logn) < O(n) < O(nlogn) < O(n2) < O(n3)

空间复杂度从小到大

O(1) < O(logn) < O(n) < O(nlogn) < O(n2) < O(n3)

2.数据结构的概念:

​ 数据结构是存储、组织数据的方式 ,指相互之间存在一种或多种特定关系的数据元素的集合
​ 通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率 , 数据结构往往影响着算法的效率,相同的数据采用不同的方式也就不同的数据结构存储,带来的运行或者存储效率是不同的

数据结构羽算法的关系

​ 数据结构只是静态的描述了数据元素之间的关系,是存储和组织数据的方式。
高效的程序需要在数据结构的基础上设计和选择算法

​ 算法是为了解决实际问题而设计的,数据结构是算法需要处理问题的载体

​ 最常用的数据运算有五种:
插入,删除,修改,查找,排序等

内存中的储存结构

​ 内存是以字节为基本存储单位的, 每个基本存储空间都有自己的地址(注意:一个内存地址代表一个字节(8bit)的存储空间)。

如:

​ 整形(int) : 4个字节
​ 字符(char): 1个字节 . 单个字符“a”占1个字节, 字符串“abc”占3个字节

数据结构的类型

一.线性结构

​ 特点:每个节点都可以有多个子节点(后继节点)和 多个父节点(前驱节点)

​ 代表: 栈,队列,链表…

​ 分类:

​ 顺序表: 将元素顺序的放在一块连续的存储区域里面,元素间的关系有他们的存储顺序自然表示

​ 分为:

​ 一体式存储

在这里插入图片描述

​ 分离式结构

在这里插入图片描述

​ 链表: 将元素存放在通过链接构造起来的一系列存储块中,存储区是非连续的

2.顺序表介绍:

​ 他属于线性结构的一种,栈,队列,都属于顺序表,特点是所有元素在内存中以连续的方式来存储

顺序表的存储结构

顺序表的完整信息包括两部分:
①数据区
②信息区,即元素存储区的容量和当前表中已有的元素个数
(大白话:信息区对数据进行描述、信息显示)

​ 数据区和信息区在一起的叫一体式存储,分 开的叫分离式存储

在这里插入图片描述

顺序表的扩充策略
  • 每次扩充固定数目的位置 (时间换空间的策略)
  • 每次扩充容量加倍 (空间换时间的策略)

在这里插入图片描述

a. 尾端加入元素,时间复杂度为O(1)
b. 非保序的加入元素(不常见),时间复杂度为O(1) eg:在指定位置1号位置加入111元素
c. 保序的元素加入,时间复杂度为O(n)

在这里插入图片描述

a. 删除表尾元素,时间复杂度为O(1)
b. 非保序的元素删除(不常见),时间复杂度为O(1),比如:在指定位置删除(1号位置)删除111,153填进来
c. 保序的元素删除,时间复杂度为O(n)

3.链表介绍

​ 他是有节点组成的,每个节点又有 数值域 和 地址域来组成

​ 特点是所有元素在内存中以 非连续的内存空间来存储,即: 有地方就行

​ 链表根据节点不同,主要分为:

1.单向链表 2.单向循环链表 3.双向链表 4.双向循环链表

单链表代码演示:
'''
链表介绍
    属于线性结构,每个节点都有一个父节点和子节点,
    链表可以看作是把节点链接起来的一个链
    由元素域 和 地址域组成
单链表: 每个节点由一个数值域和地址域组成,且每一个节点的地址域指向下一个节点的地址
且最后一个节点的地址域为:None

单向循环链表:每个节点由一个数值域和地址域组成,且每一个节点的地址域指向下一个节点的地址
且最后一个节点的地址域为:第一个节点的地址

双向链表: 每个节点由1个数值域和2个地址域组成,且每个节点的地址域分别指向前后两个节点
前一个节点的前地址域为:None 最后一个节点的后地址域为:None

双向循环链表: 每个节点由1个数值域和2个地址域组成,且每个节点的地址域分别指向前后两个节点
前一个节点的前地址域为:最后一个节点 最后一个节点的后地址域为:第一个节点
'''
'''
is_empty(self) 链表是否为空
length(self) 链表长度
travel(self. ) 遍历整个链表
add(self, item) 链表头部添加元素
append(self, item) 链表尾部添加元素
insert(self, pos, item) 指定位置添加元素
remove(self, item) 删除节点
search(self, item) 查找节点是否存在
'''


# 链表节点
class Mynode:
    def __init__(self, item):
        self.item = item
        self.next = None


# 单链表
class SingleLinkedList:
    def __init__(self, head=None):
        self.head = head

    def add(self, item):
        '''
        链表头添加节点
        :param item:
        :return:
        '''
        mynode = Mynode(item)
        mynode.next = self.head
        self.head = mynode

    def append(self, item):
        '''
        链表尾添加节点
        :return:
        '''
        if self.is_empty():
            mynode = Mynode(item)
            mynode.next = self.head
            self.head = mynode
            print('添加成功')
            return True
        head = self.head
        while head:
            item1 = head
            head = head.next
        head = item1
        mynode = Mynode(item)

        head.next = mynode
        print('添加成功')
        return True
    def is_empty(self):
        '''
        判断链表是否为空
        :return:
        '''
        return self.head is None

    def length(self):
        '''
        返回列表长度
        :return:
        '''
        length = 0
        head = self.head
        while head:
            head = head.next
            length += 1
        return length

    def remove(self, item):
        '''
        删除第一个值为item的节点
        :param item:
        :return:
        '''
        if not self.search(item):
            print(f'删除失败')
            return False
        if self.head.item == item:
            self.head = self.head.next
            print(f'删除该节点成功')
            return True
        head = self.head
        last = self.head
        while head:
            if head.item == item:
                last.next = head.next
                print(f'删除该节点成功')
                return True
            last = head
            head = head.next

    def search(self, item):
        head = self.head
        count = 1
        while head:
            if head.item == item:
                print(f'在第{count}节点找到{item}')
                return True
            head = head.next
        print(f'未找到节点{item}')
        return False

    def insert(self, pos, item):
        '''
        指定位置插入节点
        :param pos:
        :param item:
        :return:
        '''
        if pos == 0:
            # 头部添加
            self.add(item)
            print('添加成功')
            return True
        pos -= 1
        if pos > self.length():
            print('插入失败,超长')
            return False

        count = 0
        head = self.head
        while count < pos:
            head = head.next
            count += 1
        mynode = Mynode(item)
        mynode.next = head.next
        head.next = mynode
        print('插入成功')
        return True

    def travel(self):
        '''
        遍历链表输出每个节点
        :return:
        '''
        count = 0
        head = self.head
        while head:
            count += 1
            print(f'第{count}个节点,值: {head.item}')
            head = head.next


if __name__ == '__main__':
    sll = SingleLinkedList()
    print(sll.is_empty())
    sll.append(123)
    sll.add('abc')
    sll.add('abc')
    sll.add('abc')
    sll.append(0)
    print(sll.is_empty())
    print(sll.length())
    sll.travel()
    sll.insert(0, 456)
    sll.travel()
    sll.search('abc')
    sll.search('12344')
    sll.remove('1233')
    sll.remove('abc')
    sll.travel()
    sll.remove(456)
    sll.travel()
    sll.add(456)
    sll.search(456)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2119988.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【中间件】-容器编排平台Kubernetes简介

目录 什么是K8s 为什么需要K8s 什么是容器(Contianer) K8s能做什么&#xff1f; K8s的架构原理 控制平面(Control plane) kube-apiserver etcd kube-scheduler kube-controller-manager cloud-controller-manager 小结 节点组件(Node) container runtime Pod kubelet ku…

视频加密软件哪个最好用?怎么对视频文件设置加密?公司视频文件加密的最佳选择!

视频文件是企业信息传递与存储的重要载体&#xff0c;这些视频文件不仅涵盖了员工培训资料、产品演示视频、客户沟通记录等关键业务内容&#xff0c;还可能包含商业秘密、技术专利等敏感信息。 因此&#xff0c;确保视频文件的安全性&#xff0c;防止未经授权的访问、篡改或泄…

7.1图像平移

目录 实验原理 示例代码&#xff11; 运行结果&#xff11; 示例代码&#xff12; 运行结果&#xff12; 实验原理 OpenCV中&#xff0c;图像平移是一种基本的几何变换&#xff0c;指的是将图像中的每一个像素点沿着水平方向或垂直方向移动一定的距离。图像平移不改变图像…

C++位图的实现与详解

1.位图概念 在讲解位图之前我们先来看一道很经典的面试题。 给40亿个不重复的无符号整数&#xff0c;没排过序。给一个无符号整数&#xff0c;如何快速判断一个数是否在这40亿个数中。 我们有以下两种种解决方法&#xff1a; 1. 遍历&#xff0c;时间复杂度O(N)。&#xff0…

如何在红米手机中恢复已删除的照片?(6 种方式可供选择)

凭借出色的相机和实惠的价格&#xff0c;小米红米系列已成为全球知名品牌。但是&#xff0c;最近有些人抱怨他们在 红米设备上丢失了许多珍贵的图片或视频&#xff0c;并希望弄清楚如何从小米手机恢复已删除的照片。好吧&#xff0c;在小米设备上恢复已删除的视频/照片并不难。…

RK3576芯片在智能家居里中型智慧屏产品的应用方案分析

智能家居在近年来得到了快速发展&#xff0c;AI技术不断发展&#xff0c;人机交互十分成熟&#xff0c;各种家电也都迎来了智能化浪潮&#xff0c;智能家居为人们提供了优秀的产品体验&#xff0c;受到主流消费者的青睐&#xff0c;智能家居里的中型智慧屏产品也随之兴起。 瑞芯…

HTTrack

--不破不立 HTTrack 是一个免费开源的网站离线浏览器。通过它可以将整个网站下载到本地的某个目录&#xff0c;包括 html、图片和脚本以及样式文件&#xff0c;并对其中的链接进行重构以便于在本地进行浏览。 1.官网下载地址&#xff1a;https://www.httrack.com/page/2/en/in…

通信工程学习:什么是FMC固定移动融合

FMC&#xff1a;固定移动融合 FMC固定移动融合&#xff0c;即Fixed Mobile Convergence&#xff08;固定移动网络融合&#xff09;&#xff0c;是指通过固定网络与移动网络之间的融通、合作&#xff0c;实现全业务及融合业务的经营。这一技术旨在打破传统固定网络和移动网络之间…

设计模式-面试题(工厂方法模式、策略模式和责任链模式)

开闭原则&#xff1a;扩展开放、修改关闭 工厂设计模式&#xff1a;解耦 简单工厂模式 CoffeeStore和SimpleCoffeeFactory的耦合、SimpleCoffeeFactory和Coffee的耦合 后续如果再加新品种的咖啡&#xff0c;需要修改SimpleCoffeeFactory&#xff0c;这样就违反了开闭原则 简单…

探探我对测试开发的看法?

测试开发岗位主要负责确保软件的可用性和稳定性。 ● 可用性不仅包括功能的正常使用&#xff0c;还涵盖了软件在不同环境下的兼容性&#xff0c;如各种网络环境、不同 CPU 核心环境以及多样化的移动端设备等。 ● 稳定性方面我的理解是&#xff0c;测试人员不仅要从用户角度评判…

Mac无法安装软件怎么解决?mac安装软件提示无法验证开发者怎么办

在使用 macOS 系统时&#xff0c;你可能会遇到一个常见的问题&#xff1a;当你尝试安装或打开某些应用程序时&#xff0c;系统会弹出一个警告&#xff0c;提示“无法验证开发者”。出现这个提示导致自己无法去进行程序安装&#xff0c;接下来我们就来看看如何解决此问题的方法吧…

windows下载nvm并使用合集

下载nvm之前是要把node卸载的&#xff0c;不然会安装不成功 下面我先把nvm地址放上NVM下载 - NVM中文网 按照步骤按照完了一会可以使用一下命令来检查是否安装成功 nvm 安装成功后会出来版本号 下面开始安装node版本&#xff0c;很多朋友一上来直接下载node会报错 问题分析 …

【C++】_list常用方法解析及模拟实现

相信自己的力量&#xff0c;只要对自己始终保持信心&#xff0c;尽自己最大努力去完成任何事&#xff0c;就算事情最终结果是失败了&#xff0c;努力了也不留遗憾。&#x1f493;&#x1f493;&#x1f493; 目录 ✨说在前面 &#x1f34b;知识点一&#xff1a;什么是list&…

【EST】:Pt/ZrO2单原子催化剂

摘要&#xff1a;制备稳定的单原子催化剂一直是环境催化领域去除各种污染物的研究热点&#xff0c;但在提高反应性和稳定性方面仍存在挑战。在此&#xff0c;通过在锆氧化物负载的铂催化剂&#xff08;Pt–Na/ZrO2&#xff09;中简单掺杂碱金属&#xff0c;成功制备了与碱金属通…

【C++初阶】:C++入门,引用概念及其性质

文章目录 一、引用的概念二、引用的语法规则1、引用特性2、常引用 二、引用的使用场景1. 引用做参数2. 引用做返回值 三、引用和指针的区别 一、引用的概念 首先明确一下&#xff0c;引用不是定义一个新的变量&#xff0c;而是给已经存在的变量起一个别名&#xff0c;变量和他…

相机内存卡格式化了照片怎么恢复?格式化恢复详解

摄影爱好者们都知道&#xff0c;相机内存卡是记录我们美好瞬间的重要媒介。然而&#xff0c;在使用过程中&#xff0c;有时我们会因操作不当或设备故障&#xff0c;不小心格式化了内存卡&#xff0c;从而导致珍贵的照片丢失。面对这种情况&#xff0c;我们该如何恢复这些被格式…

贪吃蛇项目实现(C语言)——附源码

前言 贪吃蛇是一款十分经典的游戏&#xff0c;其通过控制贪吃蛇的上下左右移动来吃食物&#xff0c;延长自己的身体&#xff0c;也会因为撞到墙体和自身而死亡。下面我们通过C语言来实现贪吃蛇。 1.技术要点 C语言枚举&#xff0c;结构体&#xff0c;链表&#xff0c;动态内…

内网中的RDP利用

学习参考 https://www.freebuf.com/articles/network/276242.html能跟着实操的都实操一下。熟悉一些命令&#xff0c;过程。 实验环境&#xff1a;win2008&#xff0c;192.168.72.139 两个用户&#xff1a; administrator&#xff0c;shizuru RDP服务 确定/开启 RDP服务确…

力扣第79题 单词搜索

前言 记录一下刷题历程 力扣第79题 单词搜索 单词搜索 原题目&#xff1a;给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中&#xff0c;返回 true &#xff1b;否则&#xff0c;返回 false 。 单词必须按照字母顺序&#xff0c;通过相邻…

解决ubuntu安装modelsim20.1 32位库依赖失败问题(附简易安装方法)

先说方法&#xff1a;不用管&#xff0c;直接继续安装软件就行。 注意&#xff0c;选中 libgtk-3-0t64:i386 而非 libgtk-3-0:i386 注意&#xff0c;选中 libcanberra0t64:i386 而非 libcanberra0:i386 注意&#xff0c;选中 libpng16-16t64:i386 而非 libpng16-16:i386 注意&…