java list 排序性能_性能 - 为什么处理排序数组*比未排序数组慢? (Java的ArrayList.indexOf)...

这篇博客通过代码示例展示了在不同排序条件下,对随机数列表和序列号列表进行二分搜索的性能差异。实验结果显示,排序后的随机数列表搜索效率较低,而未排序的序列号列表在搜索上表现更差。这说明排序状态对搜索算法的影响显著。
摘要由CSDN通过智能技术生成

作为一个简单的例子,确认了wero的回答和apangin的答案(+1!):以下是两个选项的简单比较:

创建随机数,并可选择排序

创建序列号,并可选择地对它们进行混洗

它也没有作为JMH基准实现,但与原始代码类似,只需稍加修改即可观察效果:

import java.util.ArrayList;

import java.util.Collections;

import java.util.List;

import java.util.Random;

public class SortedListTest

{

private static final long SLOW_ITERATION_MILLIS = 1000L * 3L;

public static void main(String[] args)

{

int size = 100000;

testBinarySearchOriginal(size, true);

testBinarySearchOriginal(size, false);

testBinarySearchShuffled(size, true);

testBinarySearchShuffled(size, false);

}

public static void testBinarySearchOriginal(int size, boolean sort)

{

Random r = new Random(0);

List list = new ArrayList<>(size);

for (int i = 0; i < size; i++)

{

list.add(r.nextDouble());

}

if (sort)

{

Collections.sort(list);

}

list = new ArrayList<>(list);

int count = 0;

int nIterations = 0;

long startTime = System.currentTimeMillis();

do

{

int index = r.nextInt(size);

if (index == list.indexOf(list.get(index)))

{

count++;

}

nIterations++;

}

while (System.currentTimeMillis() < startTime + SLOW_ITERATION_MILLIS);

long duration = System.currentTimeMillis() - startTime;

double slowFindsPerSec = (double) nIterations / duration * 1000;

System.out.printf("Size %8d sort %5s iterations %10.3f count %10d\n",

size, sort, slowFindsPerSec, count);

}

public static void testBinarySearchShuffled(int size, boolean sort)

{

Random r = new Random(0);

List list = new ArrayList<>(size);

for (int i = 0; i < size; i++)

{

list.add((double) i / size);

}

if (!sort)

{

Collections.shuffle(list);

}

list = new ArrayList<>(list);

int count = 0;

int nIterations = 0;

long startTime = System.currentTimeMillis();

do

{

int index = r.nextInt(size);

if (index == list.indexOf(list.get(index)))

{

count++;

}

nIterations++;

}

while (System.currentTimeMillis() < startTime + SLOW_ITERATION_MILLIS);

long duration = System.currentTimeMillis() - startTime;

double slowFindsPerSec = (double) nIterations / duration * 1000;

System.out.printf("Size %8d sort %5s iterations %10.3f count %10d\n",

size, sort, slowFindsPerSec, count);

}

}

我机器上的输出是

Size 100000 sort true iterations 8560,333 count 25681

Size 100000 sort false iterations 19358,667 count 58076

Size 100000 sort true iterations 18554,000 count 55662

Size 100000 sort false iterations 8845,333 count 26536

很好地显示时间恰好与另一个时间相反:如果对随机数进行排序,则排序后的版本会更慢。 如果随机数被洗牌,那么洗牌版本会变慢。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值