数组分析与算法

数组定义

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

     线性表:类似于一条线的数据结构,每个线性表上的数据都只有前后两个方向,数组,队列,链表,栈都是线性表数据结构。

     连续的内存空间,来存储一组具有相同类型的数据

    数组随机访问:原理是寻找内存地址确认

      a[i]_address = base_address + i * data_type_size

    data_type_size(字节,例如int型就是4)

 

 

    数组和链表误区:

    数组查找的时间复杂度为O(1),链表的插入时间复杂度为O(1),这种说法是不准确的,准确来说,数组在随机访问的时   候时间复杂度为-1,如果要是用二分查找,则时间复杂度为O(logn).

数组的低效插入;

 如果数组定义长度为N,在数组为N的数组长度中插入一个数组到K的位置,K<N,此时需要把K-N位置的数据都要往后移动一位。

|--:插入:从最好O(1) 最坏O(n) 平均O(n)
|--: 插入:数组若无序,插入新的元素时,可以将第K个位置元素移动到数组末尾,把心的元素,插入到第k个位置,此处复杂度为O(1)。作者举例说明
|--: 删除:从最好O(1) 最坏O(n) 平均O(n)
|--: 多次删除集中在一起,提高删除效率
记录下已经被删除的数据,每次的删除操作并不是搬移数据,只是记录数据已经被删除,当数组没有更多的存储空间时,再触发一次真正的删除操作。即JVM标记清除垃圾回收算法。

GC算法:

 

标记——清除算法(Mark-Sweep)

标记——清除算法是第一种使用和比较完善的垃圾回收算法,算法分为两个过程:

1、标记所有需要回收的对象

2、标记完成后清除被标记的对象。其标记的过程就是判断对象有效性,执行可达性分析的过程。其

同样,我们也借助现实的场景进行描述。图书管里有好多人在看书,图书管理员想要收集起没有被看的书的时候,他决定让所有正在看书的人站起来,然后询问每个人:那一本书是不看的。询问完所有的人之后,同学们做下继续看书。这时候,图书管理员开始寻找所有做过标记的书,把它们收集起来。

缺点: 
1、每次进行垃圾回收时,会暂停当前用户程序的运行(类似让所有的同学站起来) 
2、垃圾回收器需要间隔性的检查,并且标记和清除的过程相对较慢。 
3、在标记清除之后可能会产生大量内存碎片,导致一旦需要为大对象分配空间时,由于找不到足够大的内存空间,而不得以引发另外一次GC过程。

标记——复制算法(Mark——Copy)

标记——复制存储算法通过采用双区域交替使用这种方式解决了标记——清除算法中效率低下的问题。它将可用内存划分为两个等量的区域(使用区和空闲区),每次只使用一块。当正在使用的区域需要进行垃圾回收时,存活的对象将被复制到另外一块区域。

图书管理员为了更好的发现不看的书,将图书室一分为二(A区和B区),同一时刻只有一块区域允许看书。开始时只允许在A区看书。当管理员想要回收A区不被看的书的时候,大喊一嗓子“正在看书的同学拿着你书到B区”。等所有人都到了B区后,图书管理员只要把A区的书收集起来,就完成了任务。下一次收集的时候,则是要求同学带着自己看的书从B区转移到A区。如此循环往复即可。

缺点: 
1、原有可用空间被缩小为1/2,空间利用率降低了。 
2、过程中也会暂停当前应用的运行

标记——整理算法(Mark——Compat)(相对标记--复制,少了一个保留区)

标记-复制算法在对象存活率较高的情况下就要进行较多的复制操作,更重要的是该算法浪费一半的内存空间,为了解决该问题,出现了标记——整理算法:其标记的过程和“标记-清除”算法一样,而整理的过程则是让所有存活的对象都向另外一端移动,然后直接清理掉端边界以外的内存。

缺点: 
1、暂停当前应用的运行,非实时性的回收。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值