等我有时间了,一定要把《算法导论》啃完,这本书的印刷质量实在太好了,滑稽。
之前听吴恩达老大说过Python里面的Numpy包的矩阵运算就是多线程的,所以能做到的情况下尽量用矩阵运算代替循环,这样能大大加快运算的速度。
为了提高速度,如果不涉及外部资源读取的话,要提高运行速度就要做到并行计算,依赖于处理器的数量;如果需要等待耗时的外部资源读取,就可以通过并发边读边运算。
算法导论有一章节提到了并行循环,多线程矩阵乘法和多线程归并排序,方法都是讲一个大的计算过程分成几个独立的小部分,各个部分让单独的线程去计算。
排序里面讲问题分解的典型的就有快排和归并,接下来看一下怎么写多线程的。
单线程的排序算法可见另外一篇文章:https://blog.csdn.net/whut2010hj/article/details/80786831
多线程归并排序
直接点的思考方式,归并排序先要把一个数据分成两个,然后这两个分别归并排序,拍完了把两个归并到一起,典型的递归。
那么我们直接点,先把数组分割好,然后开两个线程,一个线程给一个,等着两个线程都搞定了,在把两个结果合并起来。或者你觉得两个线程每个要处理的还是太长了,那就在这两个线程里面再把拿到的数组分割了,各自再开两个。尝试一下
先看下单线程的版本,做下测试
import java.util.Random;
public class Main {
public static void main(String[] args) {
int length = 1000;
int[] data = (new Data(length)).getData();
printArr(data);
System.out.println();
mergeSort(data);
printArr(data);
}
//递归
private static void mergeSort(int[] nums,int[] tmp,int left,int right){
if(left<right){
int center = (left+right)/2;
mergeSort(nums,tmp,left,center);
mergeSort(nums,tmp,center+1,right);
merge(nums,tmp,left,center+1,right);
}
}
//合并
private static void merge(int[] nums,int[] tmp,int leftPos, int rightPos, int rightEnd){
int leftEnd = rightPos-1;
int tmpPos = leftPos;
int numElements = rightEnd - leftPos + 1;
while(leftPos<=leftEnd&&rightPos<=rightEnd){
if(nums[leftPos]<nums[rightPos])
tmp[tmpPos++]=nums[leftPos++];
else
tmp[tmpPos++]=nums[rightPos++];
}
while(leftPos<=leftEnd)
tmp[tmpPos++]=nums[leftPos++];
while(rightPos<=rightEnd)
tmp[tmpPos++]=nums[rightPos++];
for(int i = 0;i<numElements;i++,rightEnd--)
nums[rightEnd]=tmp[rightEnd];
}
public static void mergeSort(int[] nums){
int[] tmp = new int[nums.length];
mergeSort(nums,tmp,0,nums.length-1);
}
//打印
public static void printArr(int[] arr) {
for(int i : arr){
System.out.print(i+" ");
}
}
}
/**
* 产生随机数据
*/
class Data{

最低0.47元/天 解锁文章
5488

被折叠的 条评论
为什么被折叠?



