zoukankan      html  css  js  c++  java
  • 数组

    1.什么是数组?

    数组(Array)是一种线性表数据结构。它用一组连续的内存空间,来存储一组具有相同类型的数据。

    2.数组的插入和删除

    数组的插入最好时间复杂度为O(1),最坏的时间复杂度为O(n),平均时间复杂度为O(n).

    数组插入的改善方法:当数组存储的无序数据时,可以将插入的值直接放入,把替换的值放入到数组的末尾.

    数组的删除的最好时间复杂度为O(1),最坏的时间复杂度为O(n),平均时间复杂度为O(n).

    数组插入的改善方法:当数组删除时,并不是真正的删除.只是标记为删除.只有当插入数据数组存储不下时开始真正的清除

    数组中标记为删除的数据.多次删除集中在一起,提高效率.

    3.数组为什么可以根据下标随机访问?

    首先数组是一个连续的内存空间.然后可以根据  a[i]_address = base_address + + i * data_type_size.这个公式在知道了

    下标的情况下取出存储的值.

    多维数组的寻址公式: 若二维数组大小为m*n,那么寻址公式为a[i][j]_address = base_address + (i * n+j)*data_type_size

    4. 容器能否完全替代数组?

    相比于数字,java中的ArrayList封装了数组的很多操作,并支持动态扩容。一旦超过村塾容量,扩容时比较耗内存,

    因为涉及到内存申请和数据搬移。

    数组适合的场景:
    1) Java ArrayList 的使用涉及装箱拆箱,有一定的性能损耗,如果特别管柱性能,可以考虑数组
    2) 若数据大小事先已知,并且涉及的数据操作非常简单,可以使用数组
    3) 表示多维数组时,数组往往更加直观。
    4) 业务开发容器即可,底层开发,如网络框架,性能优化。选择数组。

    5.数组的下标为什么要从0开始?

    1.首先数组的寻址公式为a[k]_address = base_address + k * type_size.若下标从1开始则公式将变为

    a[k]_address = base_address + (k-1)*type_size.每次随机访问数组元素都多了一次减法运算,对于 CPU 来说

    就是多了一次减法指令。数组作为非常基础的数据结构,通过下标随机访问数组元素又是其非基础的编程操作,

    效率的优化就要尽可能做到极致。所以为了减少一次减法操作,数组选择了从 0 开始编号,而不是从 1 开始.

    2.最主要的原因还是因为

    C 语言设计者用 0 开始计数数组下标,之后的 Java、JavaScript 等高级语言都效仿了 C 语言,或者说,

    为了在一定程度上减少 C 语言程序员学习 Java 的学习成本,因此继续沿用了从 0 开始计数的习惯。

    本文是在学习王争老师的数据结构与算法之美的笔记.有些是王争老师或者评论的言语.在此附上原文链接

     https://time.geekbang.org/column/article/40961

  • 相关阅读:
    All consistent reads within the same transaction read the snapshot established by the first read.
    Mojo 分析日志接口
    Mojo 分析日志接口
    Mojo Mysql utf-8字符集 需要{mysql_enable_utf8 => 1}
    Mojo Mysql utf-8字符集 需要{mysql_enable_utf8 => 1}
    MySQL 关闭FOREIGN_KEY_CHECKS检查
    MySQL 关闭FOREIGN_KEY_CHECKS检查
    14.3.2.4 Locking Reads 锁定读
    14.3.2.3 Consistent Nonlocking Reads 一致性非锁定读
    14.3.2.3 Consistent Nonlocking Reads 一致性非锁定读
  • 原文地址:https://www.cnblogs.com/yan0720/p/10567549.html
Copyright © 2011-2022 走看看