Algorithm 384. 打乱数组
Review Java 8 HashMap Implementation and Performance
Tip/Tech B+树
Share 无人机找小男孩
Algorithm
384. 打乱数组
https://leetcode-cn.com/problems/shuffle-an-array/
这道题,的思路就是有点像这种:
你在帽子中随机抽出一个数字,然后在数组中一次放置就行。
比如我们要选择放在数组第0
个位置的数字是什么,那么我们就要选择在数组的所有的位置随便选一个。
然后就继续看第1
个位置。
上面这种思想就是洗牌算法,具体的名字叫做Fisher-Yates 洗牌算法
Fisher-Yates 洗牌算法跟暴力算法很像。在每次迭代中,生成一个范围在当前下标到数组末尾元素下标之间的随机整数。接下来,将当前元素和随机选出的下标所指的元素互相交换 - 这一步模拟了每次从 “帽子” 里面摸一个元素的过程,其中选取下标范围的依据在于每个被摸出的元素都不可能再被摸出来了。此外还有一个需要注意的细节,当前元素是可以和它本身互相交换的 - 否则生成最后的排列组合的概率就不对了。
作者:LeetCode
链接:https://leetcode-cn.com/problems/shuffle-an-array/solution/da-luan-shu-zu-by-leetcode/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
接下来,我们来看看代码:
class Solution {
private int[] originArray;private int[] changeArray;private Random random;public Solution(int[] nums) {
originArray = nums.clone();changeArray = nums.clone();random = new Random();}/** Resets the array to its original configuration and return it. */public int[] reset() {
return originArray;}/** Returns a random shuffling of the array. */public int[] shuffle() {
int len = this.changeArray.length;for (int i = 0; i < len - 1; i++) {
int randomIndex = getRandomInRange(i, len) + i;swap(this.changeArray, i, randomIndex);}return this.changeArray;}private int getRandomInRange(int start, int end) {
return this.random.nextInt(end -start);}private void swap(int[] arr, int a, int b) {
int temp = arr[a];arr[a] = arr[b];arr[b] = temp;}
}
Review
Java 8 HashMap Implementation and Performance
https://dzone.com/articles/java8-hashmap-implementation-and-performance
这个主要是对HashMap的一个比较简单的分析。
HashMap的影响性能,主要是两个,一个initial capacity 和load factor.
初始的大小主要是会影响扩容,如果会不断的扩容,扩容主要是需要数据搬移,所以会很耗费时间。
以及在1.8 之后,一旦数量超过一定程度(8)了,就会转化为红黑树了。
注意要点:
- 如果有预感存的数据会很多,那么毫无疑问,你需要先设置一个比较合适的map的数组大小
- 如果你是自己的构造的类,那么你要注意你的hashcode(),如果设计不好,就会影响HashMap的哈希函数的作用,比如某些位置的数字出现的比较多,或者值分布不均衡的情况。
Tip/Tech
B+ 树
主要是B+树的索引节点和叶子及节点。
/*** 这是B+树非叶子节点的定义。** 假设keywords=[3, 5, 8, 10]* 4个键值将数据分为5个区间:(-INF,3), [3,5), [5,8), [8,10), [10,INF)* 5个区间分别对应:children[0]...children[4]** m值是事先计算得到的,计算的依据是让所有信息的大小正好等于页的大小:* PAGE_SIZE = (m-1)*4[keywordss大小]+m*8[children大小]*/
public class BPlusTreeNode {
public static int m = 5; // 5叉树public int[] keywords = new int[m-1]; // 键值,用来划分数据区间public BPlusTreeNode[] children = new BPlusTreeNode[m];//保存子节点指针
}/*** 这是B+树中叶子节点的定义。** B+树中的叶子节点跟内部结点是不一样的,* 叶子节点存储的是值,而非区间。* 这个定义里,每个叶子节点存储3个数据行的键值及地址信息。** k值是事先计算得到的,计算的依据是让所有信息的大小正好等于页的大小:* PAGE_SIZE = k*4[keyw..大小]+k*8[dataAd..大小]+8[prev大小]+8[next大小]*/
public class BPlusTreeLeafNode {
public static int k = 3;public int[] keywords = new int[k]; // 数据的键值public long[] dataAddress = new long[k]; // 数据地址public BPlusTreeLeafNode prev; // 这个结点在链表中的前驱结点public BPlusTreeLeafNode next; // 这个结点在链表中的后继结点
}
Share
Photographer uses drone with thermal camera to find missing 6-year-old boy
https://www.dpreview.com/news/1907862357/photographer-uses-drone-with-thermal-camera-to-find-missing-6-year-old-boy
这个应该科技向善例子了,用无人机来找失踪的儿童。
这个摄影师在无人机上面安装了热源传感器,用热源传感器后来找到了这个失踪小男孩。
包括中国现在的天眼系统,这些系统我相信会以后会让这个世界更好的。
这些天眼系统可以帮助的人们反恐,捉罪犯等等。
科技就应该多多应用于让人类更好。