数据结构基础笔记(6)数组

数组:如何实现基于索引的查找
数组是数据结构中的最基本结构,几乎所有的程序设计语言都把数组类型设定为固定的基础变量类型,可以把数组理解为一种容器,它可以用来存放若干个相同类型的数据元素。
例如:整型数组,字符数组,二维数组。
1.数组是什么
数组可以把这些具有下个同类型的元素,以一种不规则的顺序进行排列
这些排列好的同类数据元素的集合就被称为数组,数组在内存中是连续存放的,数组内的数据,可以通过索引值直接取出得到。
数组的索引就是对应数组空间
在进行新增、删除、查询操作的时候,可以根据代表数组空间位置的索引值进行,只要记录该数组头部的第一个数据位置,然后累加空间位置。
2.数组的基本操作
数组在存储数据时是按顺序存储的,并且存储数据的内存也是连续的
这就造成了它具有增删困难、查找容易的特点
栈和队列是加了限制的线性表,只能在特定的位置进行增删操作
相比之下,数组可以在任意位置增删数据。
2.1.数组新增数据有两个情况:
1.在数组最后新增一个元素。此时,时间复杂度为O(1)
2.如果在数组中间的某个位置新增数据,那么情况就完全不一样了,因为新增位置之后的元素位置需依次向后挪动
2.2.数组删除数据有两种情况:
1.在这个数组的最后,删除一个数据元素
此时删除一条数据后,对原数据没有产生影响,复杂度为O(1)
2.在数组之间删除数据
2.3.查找数据
查找操作由于所以的存在,基于位置的查找操作比较容易。
基于熟知的而查找也需要遍历一遍
2.4.数组增删查操作的特点
增加:若插入数据在最后,则时间复杂度为O(1);如果中间某处插入数据,则时间复杂度为O(n)
删除:对应位置的删除,扫描全数组,时间复杂度为O(n)
查找:如果只需根据索引值进行依次查找,时间复杂度是O(1)
在数组中查找一个数值满足指定条件的数据,则时间复杂度是O(n)
3.例题
假设数组存储了 5 个评委对 1 个运动员的打分,且每个评委的打分都不相等。现在需要你:
用数组按照连续顺序保存,去掉一个最高分和一个最低分后的 3 个打分样本;
计算这 3 个样本的平均分并打印。
要求是,不允许再开辟 O(n) 空间复杂度的复杂数据结构。
解法如下:
数组一次遍历,过程中记录下最小值和最大值的索引。对应下面代码的第 7 行到第 16 行。时间复杂度是 O(n)。
执行两次基于索引值的删除操作。除非极端情况,否则时间复杂度仍然是 O(n)。对应于下面代码的第 18 行到第 30 行。
计算删除数据后的数组元素的平均值。对应于下面代码的第 32 行到第 37 行。时间复杂度是 O(n)。
因此,O(n) + O(n) + O(n) 的结果仍然是 O(n)。
代码如下:

public void getScore() {

    int a[] = { 2, 1, 4, 5, 3 };

    max_inx = -1;

    max_val = -1;

    min_inx= -1;

    min_val = 99;

    for (int i = 0; i < a.length; i++) {

        if (a[i] > max_val) {

        max_val = a[i];

        max_inx = i;

    }

    if (a[i] < min_val) {

        min_val = a[i];

        min_inx = i;

    }

    }

    inx1 = max_inx;

    inx2 = min_inx;

    if (max_inx < min_inx){

        inx1 = min_inx;

        inx2 = max_inx;

    }

    for (int i = inx1; i < a.length-1; i++) {

        a[i] = a[i+1];

    }

    for (int i = inx2; i < a.length-1; i++) {

        a[i] = a[i+1];

    }

    sumscore = 0;

    for (int i = 0; i < a.length-2; i++) {

        sumscore += a[i];

	}

    avg = sumscore/3.0;

    System.out.println(avg);

}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值