一、前言
有位同學面試的時候被問到shuffle函式的實現,他之後問我,我知道這個函式怎麼用,知道是對陣列(或集合)中的元素按隨機順序重新排列。但是沒有深入研究這個是怎麼實現的。現在直接進入jdk原始碼進行分析。
二、原始碼分析
shuffle函式的原始碼如下
publicstatic
void shuffle(list<?>list, random rnd)
else
}}
說明:從原始碼可知,進行shuffle時候,是分成兩種情況。
1. 若集合元素個數小於shuffle閾值或者集合支援隨機訪問,那麼從後往前遍歷集合,交換元素。
2. 否則,先將集合轉化為陣列(提高訪問效率),再進行遍歷,交換元素(在陣列中進行),最後設定集合元素。
其中涉及的swap函式如下,兩個過載函式
publicstatic
void swap(list<?> list, int i, int
j)
private
static
void swap(object arr, int i, int
j)
說明:兩個過載函式很簡單,不再累贅。
三、總結
多看原始碼,原始碼也是最直觀的。平時多注意積累,水滴石穿。謝謝各位園友的**~
go實現陣列切片洗牌函式Shuffle
在深度學習 機器學習中,我們經常會使用到乙個叫shuffle函式,我一般叫打亂函式,也有人叫洗牌函式,就是聽著高階點,它可以幫助我們打亂資料集,那麼在go中我們如何實現乙個呢?大家可以直接使用我寫的乙個工具庫 lodago,有點lodash的味道。對於打亂函式有很多演算法實現,由於我的場景並不需要實...
Python中的shuffle 函式
描述 shuffle 方法將序列的所有元素隨機排列 語法 import random random.shuffle lst 注意 shuffle 是不能直接訪問的,需喲啊匯入random模組,然後通過random靜態物件呼叫該方法 引數 lst 可以是乙個序列或者元組 返回值 返回隨機排列後的序列 ...
面試 實現記憶體複製函式
面試中面試官經常會讓寫程式,根據題目的難度會在演算法和程式設計習慣上各有側重。比如寫乙個memcpy函式,這個題演算法簡單明確,因此重點考察程式設計習慣 工程思想。該題目的演算法如下 0.1 cpp view plain copy void memcpy void dst,void src,intc...