初探数据结构与算法
前言
编程!=单纯的写代码
学习编程不仅仅是学习各种语言的语法
程序=数据结构+算法
我将持续写一个关于数据结构与算法学习的系列
内容都是我自己学习的笔记以及心得体会
水平有限,欢迎批评指正
在具体展开学习之前我们先来看看在学习各种编程语言中都会涉及的一种简单数据结构:数组
数组基础
1.数组简介
1.1数组定义
数组(Array):是一种线性表数据结构。它使用一组连续的内存空间,来存储一组具有相同类型的数据(不一定适用所有的编程语言)。
1.1数组特点
数组的最大一个特点就是:可以进行随机访问。即数组可根据下标,直接定位到某一个元素存放的位置
计算机给一个数组分配了一组连续的存储空间,其中第一个元素开始的地址被称为 首地址。每个数据元素都有对应的下标索引和内存地址,计算机通过地址来访问数据元素。当计算机需要访问数组的某个元素时,会通过 寻址公式 计算出对应元素的内存地址,然后访问地址对应的数据元素。
寻址公式如下:下标 i 对应的数据元素地址 = 数据首地址 + i * 单个数据元素所占内存大小
1.3多维数组
以上数组都只有一个维度,为解决不同的问题,还存在多维数组。
如下图表示二维数组:
a [0] [0] | a [0] [1] | a [0] [2] |
---|---|---|
a[1] [0] | a[1] [1] | a[1] [2] |
a[2] [0] | a[2] [1] | a[2] [2] |
非常直观的一个图,很好的解释了线性结构
1.4不同编程语言中数组的实现
C / C++
中的数组最接近数组结构定义中的数组,使用的是一块存储相同类型数据的、连续的内存空间。不管是基本类型数据,还是结构体、对象,在数组中都是连续存储的。例如:
int arr[3][4]={{0,1,2,3},{4,5,6,7},{8,9,10,11}};
Java
中的数组跟数据结构定义中的数组不太一样。Java
中的数组也是存储相同类型数据的,但所使用的内存空间却不一定是连续(多维数组中)。且如果是多维数组,其嵌套数组的长度也可以不同。例如:
int[][] arr=new int [3][]{ {1,2,3}, {4,5}, {6,7,8,9}}
原生
Python
中其实没有数组的概念,而是使用了类似Java
中的ArrayList
容器类数据结构,叫做列表。通常我们把列表来作为Python
中的数组使用。Python
中列表存储的数据类型可以不一致,数组长度也可以不一致。例如:
arr=['python','java',['asp','php'],'c']
2.数组的基本操作
对于任意一种数据结构一般都会接触到四类操作:增、删、改、除
以下代码都用python编写(python代码简洁
2.1查找元素
查找数组第i个元素:注意的一点就是i
的合法性,即0<=i<=len((nums)-1)
.
arr=[0,1,2,3]
i=int(input())
if 0 <= i <= len(arr) - 1:
print(arr[i])
else:
print("error")
查找数组中元素值为 value
的位置:
arr=[0,1,2,3]
value=3
for i in range(len(arr)):
if arr[i] == value:
print(i)
2.2增加元素
插入元素操作分为两种:「在数组尾部插入值为 val
的元素」和「在数组第 i
个位置上插入值为 val
的元素」。
在数组尾部插入值为 val
的元素:如果数组尾部容量不满,则直接把 val
放在数组尾部的空闲位置,并更新数组的元素计数值。如果数组容量满了,则插入失败。不过,Python
中的 list
做了其他处理,当数组容量满了,则会开辟新的空间进行插入。
Python
中的 list
直接封装了尾部插入操作,直接调用 append
方法即可。
arr = [0, 5, 2, 3, 7, 1, 6]
val = 4
arr.append(val)
print(arr)
在数组第 i
个位置上插入值为 val
的元素:先检查插入下标 i
是否合法,即 0 <= i <= len(nums)
。确定合法位置后,通常情况下第 i
个位置上已经有数据了(除非 i == len(nums)
),要把第 i
个位置到第 len(nums) - 1
位置上的元素依次向后移动,然后再在第 i
个元素位置插入 val
值,并更新数组的元素计数值。
Python
中的 list
直接封装了中间插入操作,直接调用 insert
方法即可。
arr = [0, 5, 2, 3, 7, 1, 6]
i, val = 2, 4
arr.insert(i, val)
print(arr) `
2.4 修改元素
将数组中第 i
个元素值改为 val
:改变元素操作跟访问元素操作类似。需要先检查 i
的范围是否在合法的范围区间,即 0 <= i <= len(nums) - 1
。然后将第 i
个元素值赋值为 val
。
`def change(nums, i, val):
if 0 <= i <= len(nums) - 1:
nums[i] = val
arr = [0, 1, 2, 3, 4]
i, val = 2, 4
change(arr, i, val)
print(arr) `
2.5 删除元素
删除元素分为三种情况:「删除数组尾部元素」、「删除数组第 i
个位置上的元素」、「基于条件删除元素」。
删除数组尾部元素:只需将元素计数值减一即可。这样原来的数组尾部元素不再位于合法的数组下标范围,就相当于删除了。时间复杂度为 O(1)。
Python
中的 list
直接封装了删除数组尾部元素的操作,只需要调用 pop
方法即可。
arr=[0,1,2,3,4]
arr.pop()
print(arr)
删除数组第 i
个位置上的元素:先检查下标 i
是否合法,即 o <= i <= len(nums) - 1
。如果下标合法,则将第 i + 1
个位置到第 len(nums) - 1
位置上的元素依次向左移动。删除后修改数组的元素计数值。
Python
中的 list
直接封装了删除数组中间元素的操作,只需要以下标作为参数调用 pop
方法即可。
arr=[0,1,2,3,4,5]
i=3
arr.pop(i)
print(arr)
基于条件删除元素:这种操作一般不给定被删元素的位置,而是给出一个条件要求删除满足这个条件的(一个、多个或所有)元素。这类操作也是通过循环检查元素,查找到元素后将其删除。
例如删除某个特定值:
arr = [0, 5, 2, 3, 7, 1, 6]
i = 3
arr.remove(5)
print(arr)
总结
本文通过对数组这一简单数据结构的描述建立起初步印象
同时让我们体验探究数据结构的一般过程
之后我们将正式展开学习
注明:本文章参考datawhale开源学习资料
图片来自西安电子科技大学《c语言程序设计》