成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

數(shù)據(jù)結(jié)構(gòu)與算法:桶排序—如何根據(jù)年齡給100萬(wàn)用戶數(shù)據(jù)排序

開(kāi)發(fā) 前端
如何確定桶的 區(qū)間范圍,有很多種不同的方式。我們這里創(chuàng)建的桶數(shù)量等于原始數(shù)列的元素?cái)?shù)量,除最后一個(gè)桶只包含數(shù)列最大值外, 前面各個(gè)桶的區(qū)間按照比例來(lái)確定。

一、定義

桶排序是一種線性時(shí)間的排序算法。

桶排序需要?jiǎng)?chuàng)建若干個(gè)桶來(lái)協(xié)助排序。

每一個(gè)桶(bucket)代表一個(gè)區(qū)間范圍,里面可以承載一個(gè)或多個(gè)元素。

桶排序的第1步,就是創(chuàng)建這些桶,并確定每一個(gè)桶的區(qū)間范圍具體需要建立多少個(gè)桶,

如何確定桶的 區(qū)間范圍,有很多種不同的方式。

我們這里創(chuàng)建的桶數(shù)量等于原始數(shù)列的元素?cái)?shù)量,除最后一個(gè)桶只包含數(shù)列最大值外, 前面各個(gè)桶的區(qū)間按照比例來(lái)確定。

區(qū)間跨度 = (最大值-最小值)/ (桶的數(shù)量 - 1)

二、思路

假設(shè)有一個(gè)非整數(shù)數(shù)列如下: 4.5,0.84,3.25,2.18,0.5

第2步,遍歷原始數(shù)列,把元素對(duì)號(hào)入座放入各個(gè)桶中。

第3步,對(duì)每個(gè)桶內(nèi)部的元素分別進(jìn)行排序(顯然,只有第1個(gè)桶需要排序)

第4步,遍歷所有的桶,輸出所有元素: 0.5,0.84,2.18,3.25,4.5

三、代碼實(shí)現(xiàn)

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.LinkedList;
public class BucketSort {
public static double[] bucketSort(double[] array) {
double max = 0;
double min = 0;
//獲得最大值和最小值之間的差
for (int i = 0; i < array.length; i++) {
if (array[i] > max) {
max = array[i];
}
if (array[i] < min) {
min = array[i];
}
}
double d = max - min;
//桶初始化
int bucketNum = array.length;
ArrayList<LinkedList<Double>> bucketList =
new ArrayList<LinkedList<Double>>(bucketNum);
for (int i = 0; i < bucketNum; i++) {
bucketList.add(new LinkedList<Double>());
}
//將每個(gè)元素放入桶中
for (int i = 0; i < array.length; i++) {

int num = (int) ((array[i] - min) * (bucketNum - 1) / d);
bucketList.get(num).add(array[i]);
}
//對(duì)每個(gè)桶內(nèi)部進(jìn)行排序
for (int i = 0; i < bucketList.size(); i++) {
Collections.sort(bucketList.get(i));
}
//輸出全部元素
double[] sortedArray = new double[array.length];
int index = 0;
for (LinkedList<Double> list : bucketList) {
for (double element : list) {
sortedArray[index] = element;
index++;
}
}
return sortedArray;
}

public static void main(String[] args) {
double[] array = {4.12, 6.421, 0.0023, 3.0, 2.123, 8.122, 4.12, 10.09};
double[] sortedArray = bucketSort(array);
System.out.println(Arrays.toString(sortedArray));
}
}

四、復(fù)雜度

時(shí)間復(fù)雜度:O(n)

空間復(fù)雜度:O(n)

穩(wěn)定性:穩(wěn)定

五、適用場(chǎng)景

桶排序?qū)σ判驍?shù)據(jù)的要求是非常苛刻的。

首先,要排序的數(shù)據(jù)需要很容易就能劃分成m個(gè)桶,并且,桶與桶之間有著天然的大小順序。這樣每個(gè)桶內(nèi)的數(shù)據(jù)都排序完之后,桶與桶之間的數(shù)據(jù)不需要再進(jìn)行排序。

其次,數(shù)據(jù)在各個(gè)桶之間的分布是比較均勻的。如果數(shù)據(jù)經(jīng)過(guò)桶的劃分之后,有些桶里的數(shù)據(jù)非常多,有些非常少,很不平均,那桶內(nèi)數(shù)據(jù)排序的時(shí)間復(fù)雜度就不是常量級(jí)了。在極端情況下,如果數(shù)據(jù)都被劃分到一個(gè)桶里,那就退化為O(nlogn)的排序算法了。

桶排序比較適合用在外部排序中。所謂的外部排序就是數(shù)據(jù)存儲(chǔ)在外部磁盤中,數(shù)據(jù)量比較大,內(nèi)存有限,無(wú)法將數(shù)據(jù)全部加載到內(nèi)存中。

六、案例

1、需求

我們有10GB的訂單數(shù)據(jù),我們希望按訂單金額(假設(shè)金額都是正整數(shù))進(jìn)行排序,但是我們的內(nèi)存有限,只有幾百M(fèi)B,沒(méi)辦法一次性把10GB的數(shù)據(jù)都加載到內(nèi)存中。這個(gè)時(shí)候該怎么辦呢?

2、桶排序解決方案

我們可以先掃描一遍文件,看訂單金額所處的數(shù)據(jù)范圍。假設(shè)經(jīng)過(guò)掃描之后我們得到,訂單金額最小是1元,最大是10萬(wàn)元。我們將所有訂單根據(jù)金額劃分到100個(gè)桶里,第一個(gè)桶我們存儲(chǔ)金額在1元到1000元之內(nèi)的訂單,第二桶存儲(chǔ)金額在1001元到2000元之內(nèi)的訂單,以此類推。每一個(gè)桶對(duì)應(yīng)一個(gè)文件,并且按照金額范圍的大小順序編號(hào)命名(00,01,02...99)。

理想的情況下,如果訂單金額在1到10萬(wàn)之間均勻分布,那訂單會(huì)被均勻劃分到100個(gè)文件中,每個(gè)小文件中存儲(chǔ)大約100MB的訂單數(shù)據(jù),我們就可以將這100個(gè)小文件依次放到內(nèi)存中,用快排來(lái)排序。等所有文件都排好序之后,我們只需要按照文件編號(hào),從小到大依次讀取每個(gè)小文件中的訂單數(shù)據(jù),并將其寫(xiě)入到一個(gè)文件中,那這個(gè)文件中存儲(chǔ)的就是按照金額從小到大排序的訂單數(shù)據(jù)了。

不過(guò),你可能也發(fā)現(xiàn)了,訂單按照金額在1元到10萬(wàn)元之間并不一定是均勻分布的 ,所以10GB訂單數(shù)據(jù)是無(wú)法均勻地被劃分到100個(gè)文件中的。有可能某個(gè)金額區(qū)間的數(shù)據(jù)特別多,劃分之后對(duì)應(yīng)的文件就會(huì)很大,沒(méi)法一次性讀入內(nèi)存。這又該怎么辦呢?

針對(duì)這些劃分之后還是比較大的文件,我們可以繼續(xù)劃分,比如,訂單金額在1元到1000元之間的比較多,我們就將這個(gè)區(qū)間繼續(xù)劃分為10個(gè)小區(qū)間,1元到100元,101元到200元,201元到300元....901元到1000元。如果劃分之后,101元到200元之間的訂單還是太多,無(wú)法一次性讀入內(nèi)存,那就繼續(xù)再劃分,直到所有的文件都能讀入內(nèi)存為止。?

責(zé)任編輯:武曉燕 來(lái)源: 今日頭條
相關(guān)推薦

2021-04-02 11:09:35

MobiKwik 移動(dòng)支付數(shù)據(jù)泄露

2013-07-22 10:27:06

Ubuntu論壇數(shù)據(jù)黑客

2013-07-21 16:51:23

2021-06-17 12:51:07

數(shù)據(jù)泄漏漏洞網(wǎng)絡(luò)攻擊

2023-03-07 08:02:07

數(shù)據(jù)結(jié)構(gòu)算法數(shù)列

2023-03-10 08:07:39

數(shù)據(jù)結(jié)構(gòu)算法計(jì)數(shù)排序

2023-03-02 08:15:13

2021-11-09 15:47:05

Robinhood攻擊數(shù)據(jù)泄露

2019-05-17 10:10:30

優(yōu)衣庫(kù)黑客數(shù)據(jù)泄漏

2023-04-27 09:13:20

排序算法數(shù)據(jù)結(jié)構(gòu)

2023-03-13 10:08:31

數(shù)據(jù)結(jié)構(gòu)算法

2022-02-16 09:15:23

數(shù)據(jù)泄露網(wǎng)絡(luò)安全

2023-03-06 08:10:52

數(shù)據(jù)結(jié)構(gòu)算法數(shù)據(jù)

2023-03-23 18:31:31

2024-11-12 15:50:59

2020-08-24 13:55:58

數(shù)據(jù)安全

2014-05-14 09:53:11

2024-07-17 23:36:11

2024-10-10 14:59:49

2024-12-30 13:05:22

點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 日韩一区二区免费视频 | 国产乱码精品一区二区三区五月婷 | 亚洲日本中文 | 欧美一区二区三区在线 | 国产精品久久久久久吹潮 | 国产成人精品免费视频大全最热 | 在线视频一区二区 | 国产乱码精品一区二区三区中文 | 中文字幕不卡 | 综合亚洲视频 | 日本爱爱| 精品日韩一区二区 | 美女久久久久久久 | 亚洲成人在线视频播放 | 欧美v免费 | 国产日韩久久 | 玖草资源 | 欧美片网站免费 | 男女羞羞视频网站 | 日韩在线免费 | 亚洲精品毛片av | 四虎永久在线精品免费一区二 | 黄色大片在线视频 | 欧洲视频一区 | 亚洲综合网站 | 国产精品综合色区在线观看 | 欧美黄色网 | 亚洲精品456 | 久久久不卡网国产精品一区 | 亚洲毛片| 这里只有精品99re | 四色成人av永久网址 | 日韩a在线 | 毛片一区二区三区 | 日韩视频专区 | 91欧美精品成人综合在线观看 | 日本三级电影在线观看视频 | 欧美在线观看一区 | 99精品国产一区二区青青牛奶 | 日韩在线一区二区 | 精品国产一区一区二区三亚瑟 |