日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

颠覆:链表在删除和插入的效率一定优于数组吗?

發(fā)布時(shí)間:2024/2/28 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 颠覆:链表在删除和插入的效率一定优于数组吗? 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.


在大二我們學(xué)校的計(jì)算機(jī)大賽中,出了一道題目:要求證明對(duì)于數(shù)組和鏈表進(jìn)行500次隨機(jī)訪問(wèn),比較他們的運(yùn)行時(shí)間。這道題目對(duì)于我們程序員來(lái)說(shuō),可能潛在的答案是鏈表肯定是快的,但是結(jié)果呢?

其實(shí)數(shù)組在計(jì)算機(jī)中的存儲(chǔ)是一塊連續(xù)的內(nèi)存,通過(guò)索引訪問(wèn);而鏈表則是不連續(xù)的存儲(chǔ)單元,通過(guò)指針關(guān)聯(lián),這個(gè)基本知識(shí)大家都明白,數(shù)組中執(zhí)行插入操作時(shí),將插入點(diǎn)之后的元素依次后移一位,然后將新元素插入到騰出的位置。而進(jìn)行刪除操作時(shí)則是將指定位置的元素刪掉,之后的元素依次前移一位,這看起來(lái)是是一個(gè)比較繁瑣的過(guò)程,而對(duì)于練筆哦啊,處理方式就很簡(jiǎn)單了,需要在某個(gè)節(jié)點(diǎn)之后插入節(jié)點(diǎn)的時(shí)候,只需要將新節(jié)點(diǎn)的后繼指向該節(jié)點(diǎn)原本的后繼,再將該節(jié)點(diǎn)的后繼指向新節(jié)點(diǎn)即可,刪除節(jié)點(diǎn)則更為簡(jiǎn)單,只需要讓被刪借點(diǎn)的前驅(qū)指向他的后繼即可。

稍微思考一下,所有人都會(huì)認(rèn)為數(shù)組在這方面的效率很差,但是這份比較從根本上說(shuō)來(lái)說(shuō)是不公平的,無(wú)論是鏈表還是數(shù)組,插入和刪除都要兩個(gè)步驟,查找位置,和插入刪除,我們只關(guān)注了后者,那查找的實(shí)踐卻沒(méi)有計(jì)算在內(nèi),對(duì)于數(shù)組來(lái)說(shuō)查找位置就是查找索引的位置,這在計(jì)算機(jī)的計(jì)算中可以忽略不計(jì),而鏈表只要找到了位置,插入和刪除也就差不多完成了,所以二者的側(cè)重點(diǎn)有所不同。下面用代碼證明一下進(jìn)行隨意10000次訪問(wèn)二者所花費(fèi)的時(shí)間:

package com.heima.jianjian;


import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.List;
import java.util.Random;


public class TimeTest
{
public static void main(String[] args)
{
long[] timeBegin = new long[2];// 記錄開始時(shí)間
long[] timeEnd = new long[2];
Integer[] ia = new Integer[5000];
for (int i = 0; i < 5000; i++)
{
ia[i] = i;
}
int tempi;
Random r = new Random();
// 對(duì)ArrayList數(shù)組進(jìn)行隨機(jī)訪問(wèn)
List list = new ArrayList(Arrays.asList(ia));
timeBegin[0] = System.currentTimeMillis();
for (int i = 0; i < 10000; i++)
{
tempi = (Integer) list.get(r.nextInt(5000));


}
timeEnd[0] = System.currentTimeMillis();
// 對(duì)LinkedList進(jìn)行隨機(jī)訪問(wèn)


list = new LinkedList(Arrays.asList(ia));
timeBegin[1] = System.currentTimeMillis();
for (int i = 0; i < 10000; i++)
{
tempi = (Integer) list.get(r.nextInt(5000));


}
timeEnd[1] = System.currentTimeMillis();

System.out.println(timeEnd[0] - timeBegin[0]);
System.out.println(timeEnd[1] - timeBegin[1]);



}
}

輸出的結(jié)果分別是:5 和51毫秒 ;

可以明確的看出數(shù)組在隨機(jī)訪問(wèn)執(zhí)行上比鏈表快了將近十倍!











總結(jié)

以上是生活随笔為你收集整理的颠覆:链表在删除和插入的效率一定优于数组吗?的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。