怎么往integer型数组添加数据_重学数据结构和算法(一)

本文介绍了数据结构的重要性和不同数据结构在实际问题中的应用,以电话簿为例,讨论了按添加顺序排列和按拼音顺序排列的优缺点,并提出结合两者特点的最佳方案。接着,探讨了链表、数组、栈和队列的数据结构,分析了它们的访问、添加和删除操作的时间复杂度。此外,还提到了哈希表的概念和解决冲突的方法,以及堆和二叉查找树的特点与操作。通过对这些基础数据结构的理解,可以提高内存的利用率和算法设计能力。
摘要由CSDN通过智能技术生成

重学数据结构和算法(一)

e81aa1c871ed566024732f44c5c4b875.png

前言

    这个系列准备将数据结构和算法复习一遍,毕竟都知道在一些互联网大厂面试的时候会经常手撕算法,把自己的知识体系梳理一遍以便于平时查阅或是之后使用。而且对于一个开发来讲,只有对算法了如指掌才能做到随机应变,设计出更好的系统。这一节主要介绍一下数据结构是什么,都有哪些常见的数据结构。本节的内容相对简单,这一系列的内容将会由易到难。

1.1 什么是数据结构


决定了数据的顺序和位置关系!

数据结构包含数据的存储、数据之间的关系、数据操作。

998432650385bc9f974650dba7ebd8fc.png

数据存储在计算机的内存中,如下图,形似排成一列的箱子,一个箱子存储一个数据。当数据存储在内存时,决定他们数据顺序和位置关系的就是“数据结构”。

数据的存储就是物理结构,也就是数据在计算机内存的存储表示。

数据之间的关系就是对于逻辑结构,一种是线性关系,另一种是非线性。

线性关系:

  1. 最常用的数据结构,特点就是元素直接一对一的线性关系。

  2. 线性结构有两种不同的存储结构,顺序存储和链式存储。前者为顺序表,后者为链表。

  3. 顺序表存储元素的逻辑地址和内存地址是一样的,连续的。

  4. 链表存储相邻的元素内存上不一定连续,元素节点除了存放数据,还要存储相邻节点地址信息。

  5. 常见的线性结构:数组、队列、链表、栈。

非线性关系:

  1. 非一对一的线性关系。可能存在多个节点,如树形结构。

  2. 常见的非线性结构:二维数组,多维数组,广义表,树、图。

1.1.1 数据结构的重要性

如果你觉得数据结构不重要那就大错特错了。下面举一个电话簿的数据结构的例子来展示效率差异。

从上往下添加数据

举个简单的例子。假设我们有1个电话簿——虽说现在很多人都把电话号码存在手机里,但是这里我们考虑使用纸质电话簿的情况——每当我们得到了新的电话号码,就按从上往下的顺序把它们记在电话簿上。

假设此时我们想给“张伟”打电话,但是因为数据都是按获取顺序排列的,所以我们并不知道张伟的号码具体在哪里,只能从头一个个往下找(虽说也可以“从后往前找”或者“随机查找”,但是效率并不会比“从上往下找”高)。

如果电话簿上号码不多的话很快就能找到,但如果存了500个号码,找起来就不那么容易了。

fa36d83f7560aa0f65934df796b29452.png

按照姓名拼音排列顺序

接下来,试试以联系人姓名的拼音顺序排列吧。

因为数据都是以字典顺序排列的,所以它们是有“结构”的。使用这种方式给联系人排序的话,想要找到目标人物就轻松多了。通过姓名的拼音首字母就能推测出该数据的大致位置。

那么,如何往这个按拼音顺序排列的电话簿里添加数据呢?假设我们认识了新朋友“柯津博”并拿到了他的电话号码,打算把号码记到电话簿中。

由于数据按姓名的拼音顺序排列,所以柯津博必须写在韩宏宇和李希之间,但是上面的这张表里已经没有空位可供填写,所以需要把李希及其以下的数据往下移1行。此时我们需要从下往上执行“将本行的内容写进下一行,然后清除本行内容”的操作。如果一共有500个数据,一次操作需要10秒,那么1个小时也完成不了这项工作。

c10f54f36287f8ee024619081cc23538.png

优缺点对比

总的来说,数据按获取顺序排列的话,虽然添加数据非常简单,只需要把数据加在最后就可以了,但是在查询时较为麻烦;

以拼音顺序来排列的话,虽然在查询上较为简单,但是添加数据时又会比较麻烦。

虽说这两种方法各有各的优缺点,但具体选择哪种还是要取决于这个电话簿的用法。

如果电话簿做好之后就不再添加新号码,那么选择后者更为合适;如果需要经常添加新号码,但不怎么需要再查询,就应该选择前者。

最佳方案

我们还可以考虑一种新的排列方法,将二者的优点结合起来。那就是分别使用不同的表存储不同的拼音首字母,比如表L、表M、表N等,然后将同一张表中的数据按获取顺序进行排列。

这样一来,在添加新数据时,直接将数据加入到相应表中的末尾就可以了,而查询数据时,也只需要到其对应的表中去查找即可。因为各个表中存储的数据依旧是没有规律的,所以查询时仍需从表头开始找起,但比查询整个电话簿来说还是要轻松多了。

da425332cfb123ec396f2377f4e2117e.png

1.1.2 选择合适的数据结构以提高内存的利用率

数据结构方面的思路也和制作电话簿时的一样。

将数据存储于内存时,根据使用目的选择合适的数据结构,可以提高内存的利用率。

其实上面的两个例子就类似于数据结构中的数组、链表、图。

1.2 链表


链表是数据结构之一,他的数据呈线性排列。特点就是添加和删除特别方便,但是访问比较费时。

逻辑结构:从图上看他们是连续的(线性排列)每个节点都有一个“指针”指向下一个数据的内存地址。

7ccade940c3509c58461aa8713c93c68.png

存储结构:链式存储,从图上看,数据是分散存储的,虽然逻辑上元素连续,但是内存中不连续。

3fd1cace3b260f2ef4696f333b82c62d.png

1.2.1 元素访问

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值