java实现多条件随机森林java语言实现选择

& & & &在lock中提供了与之关联的条件,一个锁可能关联一个或多个条件,这些条件通过condition接口声明。目的是运行线程获取锁并且查看等待某一个条件是否满足,如果不满足则挂起直到某个线程唤醒它们。condition接口提供了挂起线程和唤起线程的机制;
& & & &介绍下下面一堆代码所做的事情:使用了5个线程设置(生产)一个数值,使用5个线程移除(消费)这个数值;&
在add 和 remoe中使用Condition来代替监视器锁的wait操作和唤醒操作。
& & & &值得注意的是:&&
1. 读写线程数量如果不对等,将会出现死锁。&
2. 所有的条件Condition必须使用对等的锁对象来创建lock.newCondition();&
3. 条件必须用在lock() 和 unlock() 方法之间。&
4. 在判定条件是否满足,需要在循环中判定,未满足条件的不能离开循环体,否则数据将得不到我们想要的结果&
5. 调用await()方法进入休眠的线程可能会被中断,所以必须处理InterruptedException 异常
程序运行结果:可以看出以上的结果:有值了,才能被取走,被取走了,才能被生产一个值。
ReentrantLock和ReentrantReadWriteLock(有两种锁:一种为读操作锁,通过ReadWriteLock接口的readLock()方法获取,写操作锁通过ReadWriteLock接口的writeLock()方法获取。)类构造器都有一个布尔参数fair,默认为false,即非公平状态,当很多线程在等待锁时,随机选择一个来访问临界区,若fair值为true,则成为公平模式,选择的是等待时间最长的线程。
本文已收录于以下专栏:
相关文章推荐
java.util.concurrent.lock 中的 Lock 框架是锁定的一个抽象,它允许把锁定的实现作为 Java 类,而不是作为语言的特性来实现。这就为 Lock 的多种实现留下了空间,各种...
与锁绑定的所有条件对象都是通过Lock接口声明的newCondition()方法创建的。在使用条件的时候,必须获取这个条件绑定的锁,所以带条件的代码必须在调用Lock对象的Lock()方法和unloc...
1.   简介
    可重入锁是基于AQS实现的,和synchronized有相同的语义,同时有更多的扩展功能,比如可以tryLock和在指定时间内获取锁、响应中断获取锁等。典型用法如JDK 1....
说明在并发编程中一个典型的问题是生产者–消费者问题。在程序中,有可能会需要用到两个线程通信的情况,比如生产者消费者中,获取一个共享数据,有就消费。没有就等待着生产者生产之后再继续消费。那么这个实现过程...
Java 并发包下的提供Lock,Lock相对于Synchronized可以更好的解决线程同步问题,更加的灵活和高效,并且ReadWriteLock锁还能实现读、写的分离。但线程间仅仅互斥是不够的,还...
[笔记][Java7并发编程实战手册]系列目录学习多线程之前,我觉得很有必要去学习下
[笔记][思维导图]读深入理解JAVA内存模型整理的思维导图基础知识
锁除了让临界区互斥执行外,
还可以让释放...
概要接上一篇文章,练习修改锁的公平性,和在所中使用条件。修改锁的公平性ReentrantLock
*构造一个锁对象,默认为非公平锁
public Ree...
lock详细解说请参考:Java多线程系列–“JUC锁”01之 框架lock接口
是同步代码块的另一种机制,比synchronized关键字更强大也更灵活
提供了许多新功能,例如:tryLock()方...
[笔记][Java7并发编程实战手册]系列目录简介本文继续学习信号量Semaphore机制。
在3.2中其实已经讲解完了,之前对于信号量并发的使用场景不知道,看了本章节才想到一些;
下面就以 租车...
多线程环境下,无需调用方进行任何同步处理也能保证正确性的类是线程安全的类
无状态的对象是线程安全的。无状态是指没有成员变量。由于方法的局部变量都是在线程私有的栈中分配的,因此在一个线程...
他的最新文章
讲师:王哲涵
讲师:韦玮
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)2011年10月 Java大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。排序是算法学习的第一步,想当初我学的第一个算法就是选择排序,不过当时很长一段时间我都不清楚我到底用的是选择还是冒泡还是插入。只记得两个for一个if排序就完成了。
再后来更系统地接触算法,才发现那才是排序算法队伍中小小而基本的一员。
买的《算法导论》一直没有认真地看一看,下来要找实习找工作,为了做准备,也是为了复习一下算法,便扒出来好好学一学,并做一些记录,免得我金鱼般的记忆使我看了和没看一样。
快速排序用到了分治思想,同样的还有归并排序。乍看起来快速排序和归并排序非常相似,都是将问题变小,先排序子串,最后合并。不同的是快速排序在划分子问题的时候经过多一步处理,将划分的两组数据划分为一大一小,这样在最后合并的时候就不必像归并排序那样再进行比较。但也正因为如此,划分的不定性使得快速排序的时间复杂度并不稳定。
快速排序的期望复杂度是O(nlogn),但最坏情况下可能就会变成O(n^2),最坏情况就是每次将一组数据划分为两组的时候,分界线都选在了边界上,使得划分了和没划分一样,最后就变成了普通的选择排序了。
快速排序分为三步分治过程,划分,解决,合并。
分解是将输入数组A[l..r]划分成两个子数组的过程。选择一个p,使得a被划分成三部分,分别是a[l..p-1],a[p]和a[p+1..r]。并且使得a[l..p-1]中的元素都小于等于(或大于等于)a[p],同时a[p]小于等于(或大于等于)a[p+1..r]中的所有元素。
解决是调用递归程序,解决分解中划分生成的两个子序列。
合并是递归到最深层,已经不能再划分成更小的子序列了,便开始合并。因为在分解的时候已经比较过大小,每一个父序列分解而来的两个子序列不仅是有序的,而且合并成一个序列之后还是有序的。因为快排可以在输入数组上进行操作,所以合并这一步不需要编写代码。
《算法导论》上称这样的排序为原址排序,即在原数组上操作就可以完成排序,不需要临时数组。
书上的代码非常简洁巧妙,我就不把书上的伪代码照抄上来了,这里给出的实现代码以供参考:
&code class=&language-java hljs
has-numbering& style=&display: padding: 0 color: box-sizing: border- font-family: 'Source Code Pro',font-size: white-space: border-top-left-radius: 0 border-top-right-radius: 0 border-bottom-right-radius: 0 border-bottom-left-radius: 0 word-wrap: background:&&&span class=&hljs-comment& style=&color: rgb(136, 0, 0); box-sizing: border-&&//快速排序&/span&
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&public&/span& &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&static&/span& &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&void&/span& &span class=&hljs-title& style=&box-sizing: border-&&QuickSort&/span&(&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&int&/span&[] a, &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&int&/span& left, &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&int&/span& right) {
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&if&/span& (left & right) {
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&int&/span& p = partition(a, left, right);
QuickSort(a, left, p - &span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&1&/span&);
QuickSort(a, p + &span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&1&/span&, right);
&span class=&hljs-comment& style=&color: rgb(136, 0, 0); box-sizing: border-&&//快速排序数组划分&/span&
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&private&/span& &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&static&/span& &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&int&/span& &span class=&hljs-title& style=&box-sizing: border-&&partition&/span&(&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&int&/span&[] a, &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&int&/span& left, &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&int&/span& right) {
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&int&/span& x = a[right];
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&int&/span& p = left - &span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&1&/span&;
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&for&/span& (&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&int&/span& i = i & i++) {
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&if&/span& (a[i] &= x) {
swap(a, p, i);
swap(a, p+&span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&1&/span&, right);
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&return&/span& p+&span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&1&/span&;
}&/code&&ul class=&pre-numbering& style=&box-sizing: border- position: width: 50 top: 0 left: 0 margin: 0 padding: 6px 0px 40 border-right-width: 1 border-right-style: border-right-color: rgb(221, 221, 221); list-style: text-align: background-color: rgb(238, 238, 238);&&&li style=&box-sizing: border- padding: 0px 5&&1&/li&&li style=&box-sizing: border- padding: 0px 5&&2&/li&&li style=&box-sizing: border- padding: 0px 5&&3&/li&&li style=&box-sizing: border- padding: 0px 5&&4&/li&&li style=&box-sizing: border- padding: 0px 5&&5&/li&&li style=&box-sizing: border- padding: 0px 5&&6&/li&&li style=&box-sizing: border- padding: 0px 5&&7&/li&&li style=&box-sizing: border- padding: 0px 5&&8&/li&&li style=&box-sizing: border- padding: 0px 5&&9&/li&&li style=&box-sizing: border- padding: 0px 5&&10&/li&&li style=&box-sizing: border- padding: 0px 5&&11&/li&&li style=&box-sizing: border- padding: 0px 5&&12&/li&&li style=&box-sizing: border- padding: 0px 5&&13&/li&&li style=&box-sizing: border- padding: 0px 5&&14&/li&&li style=&box-sizing: border- padding: 0px 5&&15&/li&&li style=&box-sizing: border- padding: 0px 5&&16&/li&&li style=&box-sizing: border- padding: 0px 5&&17&/li&&li style=&box-sizing: border- padding: 0px 5&&18&/li&&li style=&box-sizing: border- padding: 0px 5&&19&/li&&li style=&box-sizing: border- padding: 0px 5&&20&/li&&li style=&box-sizing: border- padding: 0px 5&&21&/li&&li style=&box-sizing: border- padding: 0px 5&&22&/li&&/ul&&ul class=&pre-numbering& style=&box-sizing: border- position: width: 50 top: 0 left: 0 margin: 0 padding: 6px 0px 40 border-right-width: 1 border-right-style: border-right-color: rgb(221, 221, 221); list-style: text-align: background-color: rgb(238, 238, 238);&&&li style=&box-sizing: border- padding: 0px 5&&1&/li&&li style=&box-sizing: border- padding: 0px 5&&2&/li&&li style=&box-sizing: border- padding: 0px 5&&3&/li&&li style=&box-sizing: border- padding: 0px 5&&4&/li&&li style=&box-sizing: border- padding: 0px 5&&5&/li&&li style=&box-sizing: border- padding: 0px 5&&6&/li&&li style=&box-sizing: border- padding: 0px 5&&7&/li&&li style=&box-sizing: border- padding: 0px 5&&8&/li&&li style=&box-sizing: border- padding: 0px 5&&9&/li&&li style=&box-sizing: border- padding: 0px 5&&10&/li&&li style=&box-sizing: border- padding: 0px 5&&11&/li&&li style=&box-sizing: border- padding: 0px 5&&12&/li&&li style=&box-sizing: border- padding: 0px 5&&13&/li&&li style=&box-sizing: border- padding: 0px 5&&14&/li&&li style=&box-sizing: border- padding: 0px 5&&15&/li&&li style=&box-sizing: border- padding: 0px 5&&16&/li&&li style=&box-sizing: border- padding: 0px 5&&17&/li&&li style=&box-sizing: border- padding: 0px 5&&18&/li&&li style=&box-sizing: border- padding: 0px 5&&19&/li&&li style=&box-sizing: border- padding: 0px 5&&20&/li&&li style=&box-sizing: border- padding: 0px 5&&21&/li&&li style=&box-sizing: border- padding: 0px 5&&22&/li&&/ul&
其中的swap函数如下:
&code class=&language-java hljs
has-numbering& style=&display: padding: 0 color: box-sizing: border- font-family: 'Source Code Pro',font-size: white-space: border-top-left-radius: 0 border-top-right-radius: 0 border-bottom-right-radius: 0 border-bottom-left-radius: 0 word-wrap: background:&&&span class=&hljs-comment& style=&color: rgb(136, 0, 0); box-sizing: border-&&//交换数组a中的a[i]和a[j]&/span&
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&private&/span& &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&static&/span& &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&void&/span& &span class=&hljs-title& style=&box-sizing: border-&&swap&/span&(&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&int&/span&[] a, &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&int&/span& i, &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&int&/span& j) {
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&int&/span& temp = a[i];
a[i] = a[j];
}&/code&&ul class=&pre-numbering& style=&box-sizing: border- position: width: 50 top: 0 left: 0 margin: 0 padding: 6px 0px 40 border-right-width: 1 border-right-style: border-right-color: rgb(221, 221, 221); list-style: text-align: background-color: rgb(238, 238, 238);&&&li style=&box-sizing: border- padding: 0px 5&&1&/li&&li style=&box-sizing: border- padding: 0px 5&&2&/li&&li style=&box-sizing: border- padding: 0px 5&&3&/li&&li style=&box-sizing: border- padding: 0px 5&&4&/li&&li style=&box-sizing: border- padding: 0px 5&&5&/li&&li style=&box-sizing: border- padding: 0px 5&&6&/li&&/ul&&ul class=&pre-numbering& style=&box-sizing: border- position: width: 50 top: 0 left: 0 margin: 0 padding: 6px 0px 40 border-right-width: 1 border-right-style: border-right-color: rgb(221, 221, 221); list-style: text-align: background-color: rgb(238, 238, 238);&&&li style=&box-sizing: border- padding: 0px 5&&1&/li&&li style=&box-sizing: border- padding: 0px 5&&2&/li&&li style=&box-sizing: border- padding: 0px 5&&3&/li&&li style=&box-sizing: border- padding: 0px 5&&4&/li&&li style=&box-sizing: border- padding: 0px 5&&5&/li&&li style=&box-sizing: border- padding: 0px 5&&6&/li&&/ul&
QuickSort(int[] a,int left,int right)函数没什么好说的,设置递归边界,接下来递归处理左序列,再处理右序列。
下来的partition(int[] a, int left, int right)就比较有意思了。
int x = a[right];这行代码选中一个主元,这里我们每次选择的都是当前序列中最右边那个。int
p = left - 1;这行代码保存了一个变量p,用来记录比主元小的所有元素中,在序列中存放的位置最靠右的那个。接下来是个循环,从当前序列的第一个循环到倒数第二个(right-1)元素,来进行和主元比较。因为最后一个已经是主元了,所以就没有必要循环到right了。循环里面先是一个比较if
(a[i] &= x)。这里写的是小于等于,更改这个就可以改变序列式由小到大还是由大到小排列。这里则是由小到大排列。如果进入了if语句,则说明a[i](当前元素)比主元小,还记得之前的变量p吗,保存着比主元小的元素最右边的位置,这里先p++,接着把a[i]和a[p]交换,就是说把a[p]右边的元素和当前元素换位置。a[p]右边的元素是什么呢?可能就是当前元素,也可能是比主元大的元素。这样,就完成了比主元小的元素的处理。
可是如果a[i]&x呢,则不进入if执行这两行代码,也就是不动那个比主元大的元素。
这样直到循环结束,整个序列就变成了三部分,从a[left..p]是比主元小的元素,a[p+1..right-1]是比主元大的元素,a[right]则是主元。而我们划分的目的是将主元放在这两个序列的中间,则再执行一行语句swap(a,
p+1, right);,将主元和比它大序列的第一个元素互换位置,就大功告成了。
书上的图解非常的清晰:(标号是根据上面代码所标,和书上不太一样,但意思是一样的)
这张图描述了一次划分。浅蓝色部分是不大于主元的部分,深蓝色部分是大于主元的部分。没有颜色的是还未处理的元素,最后的元素则是主元。
快速排序的主要内容差不多就这些了,书上接下来证明了快速排序的正确性,以及计算了其时间复杂度。之后讨论了划分的不平衡性所导致的性能退化。对一个排好序的序列使用上述快排,时间复杂度为O(n^2),而插入排序则仅为O(n)。因此便有了随机化快速排序的出现。
快速排序的随机化版本
上面版本的快排在选取主元的时候,每次都选取最右边的元素。当序列为有序时,会发现划分出来的两个子序列一个里面没有元素,而另一个则只比原来少一个元素。为了避免这种情况,引入一个随机化量来破坏这种有序状态。
在随机化的快排里面,选取a[left..right]中的随机一个元素作为主元,然后再进行划分,就可以得到一个平衡的划分。
实现起来其实只需要对上面的代码做小小的修改就可以了。
&code class=&language-java hljs
has-numbering& style=&display: padding: 0 color: box-sizing: border- font-family: 'Source Code Pro',font-size: white-space: border-top-left-radius: 0 border-top-right-radius: 0 border-bottom-right-radius: 0 border-bottom-left-radius: 0 word-wrap: background:&&&span class=&hljs-comment& style=&color: rgb(136, 0, 0); box-sizing: border-&&//快速排序的随机化版本,除了调用划分函数不同,和之前快排的代码结构一模一样&/span&
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&public&/span& &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&static&/span& &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&void&/span& &span class=&hljs-title& style=&box-sizing: border-&&RandomQuickSort&/span&(&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&int&/span&[] a, &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&int&/span& left, &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&int&/span& right) {
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&if&/span& (left & right) {
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&int&/span& p = randomPartition(a, left, right);
RandomQuickSort(a, left, p - &span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&1&/span&);
RandomQuickSort(a, p + &span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&1&/span&, right);
&span class=&hljs-comment& style=&color: rgb(136, 0, 0); box-sizing: border-&&//随机化划分&/span&
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&public&/span& &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&static&/span& &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&int&/span& &span class=&hljs-title& style=&box-sizing: border-&&randomPartition&/span&(&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&int&/span&[] a, &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&int&/span& left, &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&int&/span& right) {
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&int&/span& r = random.nextInt(right - left) + &span class=&hljs-comment& style=&color: rgb(136, 0, 0); box-sizing: border-&&//生成一个随机数,即是主元所在位置&/span&
swap(a, right, r); &span class=&hljs-comment& style=&color: rgb(136, 0, 0); box-sizing: border-&&//将主元与序列最右边元素互换位置,这样就变成了之前快排的形式。&/span&
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&return&/span& partition(a, left, right); &span class=&hljs-comment& style=&color: rgb(136, 0, 0); box-sizing: border-&&//直接调用之前的代码&/span&
}&/code&&ul class=&pre-numbering& style=&box-sizing: border- position: width: 50 top: 0 left: 0 margin: 0 padding: 6px 0px 40 border-right-width: 1 border-right-style: border-right-color: rgb(221, 221, 221); list-style: text-align: background-color: rgb(238, 238, 238);&&&li style=&box-sizing: border- padding: 0px 5&&1&/li&&li style=&box-sizing: border- padding: 0px 5&&2&/li&&li style=&box-sizing: border- padding: 0px 5&&3&/li&&li style=&box-sizing: border- padding: 0px 5&&4&/li&&li style=&box-sizing: border- padding: 0px 5&&5&/li&&li style=&box-sizing: border- padding: 0px 5&&6&/li&&li style=&box-sizing: border- padding: 0px 5&&7&/li&&li style=&box-sizing: border- padding: 0px 5&&8&/li&&li style=&box-sizing: border- padding: 0px 5&&9&/li&&li style=&box-sizing: border- padding: 0px 5&&10&/li&&li style=&box-sizing: border- padding: 0px 5&&11&/li&&li style=&box-sizing: border- padding: 0px 5&&12&/li&&li style=&box-sizing: border- padding: 0px 5&&13&/li&&li style=&box-sizing: border- padding: 0px 5&&14&/li&&li style=&box-sizing: border- padding: 0px 5&&15&/li&&/ul&&ul class=&pre-numbering& style=&box-sizing: border- position: width: 50 top: 0 left: 0 margin: 0 padding: 6px 0px 40 border-right-width: 1 border-right-style: border-right-color: rgb(221, 221, 221); list-style: text-align: background-color: rgb(238, 238, 238);&&&li style=&box-sizing: border- padding: 0px 5&&1&/li&&li style=&box-sizing: border- padding: 0px 5&&2&/li&&li style=&box-sizing: border- padding: 0px 5&&3&/li&&li style=&box-sizing: border- padding: 0px 5&&4&/li&&li style=&box-sizing: border- padding: 0px 5&&5&/li&&li style=&box-sizing: border- padding: 0px 5&&6&/li&&li style=&box-sizing: border- padding: 0px 5&&7&/li&&li style=&box-sizing: border- padding: 0px 5&&8&/li&&li style=&box-sizing: border- padding: 0px 5&&9&/li&&li style=&box-sizing: border- padding: 0px 5&&10&/li&&li style=&box-sizing: border- padding: 0px 5&&11&/li&&li style=&box-sizing: border- padding: 0px 5&&12&/li&&li style=&box-sizing: border- padding: 0px 5&&13&/li&&li style=&box-sizing: border- padding: 0px 5&&14&/li&&li style=&box-sizing: border- padding: 0px 5&&15&/li&&/ul&
这里的random是一个已经初始化过的Random的静态对象。
随机化快排就这样就ok了。
为了比较普通快排和随机化快排的性能,我做了一些测试。因为没有太多的经验,测试结果仅供参考。:)
数组生成代码
&code class=&language-java hljs
has-numbering& style=&display: padding: 0 color: box-sizing: border- font-family: 'Source Code Pro',font-size: white-space: border-top-left-radius: 0 border-top-right-radius: 0 border-bottom-right-radius: 0 border-bottom-left-radius: 0 word-wrap: background:&&Random random = &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&new&/span& Random(Calendar.getInstance().getTimeInMillis());
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&int&/span&[] a = &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&new&/span& &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&int&/span&[&span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&&/span&];
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&int&/span&[] b = &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&new&/span& &span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&int&/span&[&span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&&/span&];
&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&for&/span& (&span class=&hljs-keyword& style=&color: rgb(0, 0, 136); box-sizing: border-&&int&/span& i = &span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&0&/span&; i & a. i++) {
a[i] = random.nextInt(Integer.MAX_VALUE);
b[i] = a[i];
}&/code&&ul class=&pre-numbering& style=&box-sizing: border- position: width: 50 top: 0 left: 0 margin: 0 padding: 6px 0px 40 border-right-width: 1 border-right-style: border-right-color: rgb(221, 221, 221); list-style: text-align: background-color: rgb(238, 238, 238);&&&li style=&box-sizing: border- padding: 0px 5&&1&/li&&li style=&box-sizing: border- padding: 0px 5&&2&/li&&li style=&box-sizing: border- padding: 0px 5&&3&/li&&li style=&box-sizing: border- padding: 0px 5&&4&/li&&li style=&box-sizing: border- padding: 0px 5&&5&/li&&li style=&box-sizing: border- padding: 0px 5&&6&/li&&li style=&box-sizing: border- padding: 0px 5&&7&/li&&/ul&&ul class=&pre-numbering& style=&box-sizing: border- position: width: 50 top: 0 left: 0 margin: 0 padding: 6px 0px 40 border-right-width: 1 border-right-style: border-right-color: rgb(221, 221, 221); list-style: text-align: background-color: rgb(238, 238, 238);&&&li style=&box-sizing: border- padding: 0px 5&&1&/li&&li style=&box-sizing: border- padding: 0px 5&&2&/li&&li style=&box-sizing: border- padding: 0px 5&&3&/li&&li style=&box-sizing: border- padding: 0px 5&&4&/li&&li style=&box-sizing: border- padding: 0px 5&&5&/li&&li style=&box-sizing: border- padding: 0px 5&&6&/li&&li style=&box-sizing: border- padding: 0px 5&&7&/li&&/ul&
测试代码:
&code class=&language-java hljs
has-numbering& style=&display: padding: 0 color: box-sizing: border- font-family: 'Source Code Pro',font-size: white-space: border-top-left-radius: 0 border-top-right-radius: 0 border-bottom-right-radius: 0 border-bottom-left-radius: 0 word-wrap: background:&&&span class=&hljs-comment& style=&color: rgb(136, 0, 0); box-sizing: border-&&//随机化快排&/span&
startTime = System.currentTimeMillis();
Sort.RandomQuickSort(a, &span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&0&/span&, a.length - &span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&1&/span&);
endTime = System.currentTimeMillis();
o(String.format(&span class=&hljs-string& style=&color: rgb(0, 136, 0); box-sizing: border-&&&RandomQuickSort Finished. Cost %dms\n&&/span&, endTime - startTime));&span class=&hljs-comment& style=&color: rgb(136, 0, 0); box-sizing: border-&&//o是一个输出函数,把系统的System.out.print()简单封装了一下,打起来短一些……&/span&
&span class=&hljs-comment& style=&color: rgb(136, 0, 0); box-sizing: border-&&//快排&/span&
startTime = System.currentTimeMillis();
Sort.QuickSort(b, &span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&0&/span&, b.length - &span class=&hljs-number& style=&color: rgb(0, 102, 102); box-sizing: border-&&1&/span&);
endTime = System.currentTimeMillis();
o(String.format(&span class=&hljs-string& style=&color: rgb(0, 136, 0); box-sizing: border-&&&QuickSort Finished. Cost %dms\n&&/span&, endTime - startTime));&/code&&ul class=&pre-numbering& style=&box-sizing: border- position: width: 50 top: 0 left: 0 margin: 0 padding: 6px 0px 40 border-right-width: 1 border-right-style: border-right-color: rgb(221, 221, 221); list-style: text-align: background-color: rgb(238, 238, 238);&&&li style=&box-sizing: border- padding: 0px 5&&1&/li&&li style=&box-sizing: border- padding: 0px 5&&2&/li&&li style=&box-sizing: border- padding: 0px 5&&3&/li&&li style=&box-sizing: border- padding: 0px 5&&4&/li&&li style=&box-sizing: border- padding: 0px 5&&5&/li&&li style=&box-sizing: border- padding: 0px 5&&6&/li&&li style=&box-sizing: border- padding: 0px 5&&7&/li&&li style=&box-sizing: border- padding: 0px 5&&8&/li&&li style=&box-sizing: border- padding: 0px 5&&9&/li&&li style=&box-sizing: border- padding: 0px 5&&10&/li&&/ul&&ul class=&pre-numbering& style=&box-sizing: border- position: width: 50 top: 0 left: 0 margin: 0 padding: 6px 0px 40 border-right-width: 1 border-right-style: border-right-color: rgb(221, 221, 221); list-style: text-align: background-color: rgb(238, 238, 238);&&&li style=&box-sizing: border- padding: 0px 5&&1&/li&&li style=&box-sizing: border- padding: 0px 5&&2&/li&&li style=&box-sizing: border- padding: 0px 5&&3&/li&&li style=&box-sizing: border- padding: 0px 5&&4&/li&&li style=&box-sizing: border- padding: 0px 5&&5&/li&&li style=&box-sizing: border- padding: 0px 5&&6&/li&&li style=&box-sizing: border- padding: 0px 5&&7&/li&&li style=&box-sizing: border- padding: 0px 5&&8&/li&&li style=&box-sizing: border- padding: 0px 5&&9&/li&&li style=&box-sizing: border- padding: 0px 5&&10&/li&&/ul&
RandomQuickSort Finished. Cost 1417ms&
QuickSort Finished. Cost 1367ms
多次实验结果:
随机化版本快排
随机化版本快排
随机化版本快排
随机化快排因为要生成随机数,所以有一些性能损失,所以数据规模较小,数据分布均匀时普通快排还是比随机化快排要快些的,不过随着数据规模的上升,随机化快排的性能优势就展现出来了。
下来才是展示快排才华的时候,假设当输入数组已经是排好序的,这两个算法的性能差距又有多少?&
之前的数组生成代码不变,只是在调用两个算法之前,先调用一下快排将数组排序,然后将两个有序的数组作为参数传进去。
10w的普通快排……已经栈溢出了。
随机化版本快排
试一试1w的
随机化版本快排
看下1000w下随机化快排是否有影响
随机化版本快排
这篇笔记就到这儿了,希望能通过讲解一遍加深记忆,也希望能给别人带来哪怕一点点帮助。
参考书籍:机械工业出版社 第三版《算法导论》部分内容引自原书
本文已收录于以下专栏:
相关文章推荐
import java.util.Apublic class QuickSort{
public static void main(String[] args){
public class jj {
public static void main(String[] args) {
int []a={1,3,43,5,33,53,3,7,-9,23,...
java快速排序
经过自己一下午的努力!从网上寻找java的快速排序源码,努力理解。终于完成了!我在理解的过程中所遇到的困难,主要就是分治思想,当经过一次排序后,通过所选的基准元素把数组分成了俩...
此题经常在笔试题中遇到,故特记录于此
归并排序就是利用归并的思想实现的排序方法。而且充分利用了完全二叉树的深度特性,因此效率比较高。其基本原理如下:对于给定的一组记录,利用递归与分治技术将数据序列划分成为越来越小的半子表,在对半子表排序,...
说来感到惭愧,昨天看别人的博客上面一一讲了一些算法,其实这些算法在大学都学过,不过几乎全部忘记了。虽然现在做java上层开发基本上用不到算法,但是还是感觉算法是一种思想,是一种灵魂,所以又不仅翻开了严...
1、基本思想堆是一种特殊的树形数据结构,其每个节点都有一个值,通常提到的堆都是指一颗完全二叉树,根结点的值小于(或大于)两个子节点的值,同时,根节点的两个子树也分别是一个堆。
堆排序就是利用堆(...
下面的内容包括Struts 2和Hibernate的常见面试题,虽然Struts 2在2013年6月曝出高危漏洞后已经显得江河日下,而Spring MVC的异军突起更加加速了Struts 2的陨落,但...
Volatile的特征:A、原子性
B、可见性Volatile的内存语义:当写一个volatile变量时,JMM会把线程对应的本地内存中的共享变量值刷新到主内存。当读一个volatile变量时,JM...
public class BinarySearchTree& {
    private N//根节点
    //节点数
    /*
他的最新文章
讲师:王哲涵
讲师:韦玮
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)}

我要回帖

更多关于 随机森林java语言实现 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信