首页 > 编程知识 正文

算法与数据结构心得体会,数据结构学霸笔记

时间:2023-05-06 17:18:56 阅读:135729 作者:292

先总结几个概念算法的概念。 五个特性输入、输出、贫穷、确定、可行。

算法是计算机处理信息的本质。 因为计算机程序本质上是向计算机传达执行指定任务的准确步骤的算法。 通常,当算法处理信息时,从输入设备或数据的存储地址读取数据,并将结果写入输出设备或某个存储地址以后调用。

算法是解决独立存在的问题的方法和思想。

对算法来说,实现的语言不重要,思想重要。

算法有多种语言描述实现版本,包括C描述、C描述和Python描述,但目前正在用Python语言描述实现。

数据结构一个学生的信息可以用list保存,也可以用词典dict保存。 在这两种保存下寻找学生信息时,时间的复杂度不同。

为了解决问题,需要保存数据,并根据保存数据的方式设计和处理算法的实现。 如果保存数据的方式不同,就需要用不同的算法进行处理。 算法解决问题的效率越高,就越需要考虑数据如何保存。 这就是数据结构。

算法和数据结构是不可分割的。 数据是一个抽象的概念,对其进行分类得到编程语言中的基本类型。 例如int、float、char等。 数据要素之间没有独立的关系,存在特定的关系,这些关系是结构。 数据结构是数据对象中数据元素之间的关系。

Python为我们提供了很多现成的数据结构类型。 这些系统是自己定义的,不需要自己定义的数据结构是Python的嵌入式数据结构,如列表、元组、字典。 另一方面,Python系统也有未直接定义的数据组织方法。 您需要自己定义如何组织这些数据。 这些数据的组织方式称为堆栈、队列等Python的扩展数据结构。

算法和数据结构的区别

数据结构只是静态描述了数据元素之间的关系。

高效的程序需要根据数据结构设计和选择算法。

程序=数据结构算法

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

存储器

的类型需要占用几个字节的内存大小(不同类型占用的空间不同)-----存储

我取出的几个字节是什么类型的? int 4字节char 1字节

的所有高级数据结构都具有基本的数据结构配置

例如,int占用的4字节的int 1以00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

八。 顺序表

将数据存储在内存中的连续区域

图a表示顺序表的基本形式,数据要素本身被连续存储,各要素所占的存储单元的大小是一定的(数据类型相同),要素的下标是其逻辑地址。 另外一方面,存储元素物理地址)实际的存储器地址)可以通过将逻辑地址)第I个元素)和存储单元的尺寸) c )的乘积与存储区域的开头地址loc ) e0 )相加来计算。

loc(ei ) loc(ei ) c*i

因此,访问指定的要素时,不从最初开始进行遍历,就可以通过计算得到对应的地址,其时间复杂度为o(1)。

如果元素大小不一致,则需要以图b中元素外置的形式单独存储实际数据元素,并保存与顺序表中每个元素位置对应的元素的地址信息,即链接。 由于各链接所需的存储量相同,所以根据上述公式,可以计算要素链接的存储位置,沿着链接找到实际存储的数据要素。 请注意,图b中的c是存储链接目标所需的存储量,而不是数据元素的大小。 通常这个量很少。

图b中的有序表也被称为实际数据的索引,这是最简单的索引结构。

0下标可以理解为偏移,所以在寻址时特别有用

顺序表的结构

顺序表的完整信息由两部分组成:表中的元素集合,以及为实现正确操作而必须记录的信息,即有关表整体情况的信息。 此信息主要包括两个元素存储区的容量和当前表中现有元素的数量。

顺序表的两种基本方式

图a为一体型结构,存储表信息的单元和要素存储区域连续配置在一个存储区域,两个部分数据的整体形成一个完整的顺序表对象。

一体化结构整体性强,容易管理。 但是,由于数据元素存储是表对象的一部分,因此创建顺序表后,元素存储将是固定的。

图b为分离结构,表对象中只存储了整个表的相关信息,即容量、元素数量,实际数据元素存储在另一个独立的元素存储器中,并通过链接与基本表对象相关联。

替换元素存储

一体化结构由于顺序表信息区和数据区连续存储,想要改变数据区,只能整体转移。 即,整个顺序表的对象(存储顺序表的结构信息的区域)发生变化。

如果要交换数据区域,隔离结构只需更新表信息区域中数据区域的链接即可,该顺序表的对象不变。

元素存储扩展

通过使用分隔结构顺序表,可以用更大的区域替换数据区域,从而在不更改表对象的情况下扩展数据区域,并且不需要更改使用此表的所有位置。 只要程序运行环境(计算机系统)中有可用存储器,此表结构就不会因满而无法操作。 人们把用这个技术实现的顺序表

动态顺序表,因为其容量可以在使用中动态变化。

扩充的两种策略

每次扩充增加固定数目的存储位置,如每次扩充增加10个元素位置,这种策略可称为线性增长。

特点:节省空间,但是扩充操作频繁,操作次数多。

每次扩充容量加倍,如每次扩充增加一倍存储空间。

特点:减少了扩充操作的执行次数,但可能会浪费空间资源。以空间换时间,推荐的方式。

顺序表的操作

插入 1)对未插入 2)保序插入 O(n) 3)不保序插入

删除 2)对尾删除 2)保序删除 3)不保序删除

Python中的顺序表
Python中的list和tuple两种类型采用了顺序表的实现技术,具有前面讨论的顺序表的所有性质。

tuple是不可变类型,即不变的顺序表,因此不支持改变其内部状态的任何操作,而其他方面,则与list的性质类似。

list的基本实现技术
Python标准类型list就是一种元素个数可变的线性表,可以加入和删除元素,并在各种操作中维持已有元素的顺序(即保序),而且还具有以下行为特征:

基于下标(位置)的高效元素访问和更新,时间复杂度应该是O(1);

为满足该特征,应该采用顺序表技术,表中元素保存在一块连续的存储区中。

允许任意加入元素,而且在不断加入元素的过程中,表对象的标识(函数id得到的值)不变。

为满足该特征,就必须能更换元素存储区,并且为保证更换存储区时list对象的标识id不变,只能采用分离式实现技术。

在Python的官方实现中,list就是一种采用分离式技术实现的动态顺序表。这就是为什么用list.append(x) (或 list.insert(len(list), x),即尾部插入)比在指定位置插入元素效率高的原因。

在Python的官方实现中,list实现采用了如下的策略:在建立空表(或者很小的表)时,系统分配一块能容纳8个元素的存储区;在执行插入操作(insert或append)时,如果元素存储区满就换一块4倍大的存储区。但如果此时的表已经很大(目前的阀值为50000),则改变策略,采用加一倍的方法。引入这种改变策略的方式,是为了避免出现过多空闲的存储位置。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。