要求:给定一个文件,文件每一行为一个浮点数,找出最大的1万个

要求:给定一个文件包含10亿个数,文件每一行为一个浮点数,找出最大的1万个

算法描述:

基本思路:每个浮点数8B,10亿个会溢出,采取分治法先先处理一部分数据,然后对处理后的数据进行综合

以下采用是算法流程,使用Pasacle和JAVA的语法,第一个函数是主函数。

  1. dataCompress()
  2. BEGIN
  3.      List<float[]> list = new List<float[]>();
  4.      WHILE not reach EOF 
  5.           float[] partFile = readFileTop1MilleLine();
  6.           float[] top10Thousand = searchTop(partFile, 10000);
  7.           list.add(top10Thousand);
  8.      END WHILE
  9.      
  10.      float[][] parts= list.toArray();
  11.      float[] result = merge(parts)
  12. END
  13. float[] searchTop(float[] arr, int topCount)
  14. BEGIN
  15.      boolean isSwap = true;
  16.      int min = 0, minIndex = 0;
  17.      FOR int currentIndex = topCount;currentIndex < arr.length();currentIndex++
  18.           IF isSwap == true
  19.                min = arr[0];
  20.                minIndex = 0
  21.                FOR(int i = 1; i < topCount; i++)
  22.                 IF arr[i] < min
  23.                  min = arr[i];
  24.                  minIndex = i;
  25.                 ENDIF
  26.                ENDFOR  
  27.           ENDIF
  28.           IF arr[currentIndex] > min
  29.                swap(arr, currentIndex, minIndex);
  30.                isSwap = true;
  31.           ENDIF
  32.           ELSE
  33.              isSwap = false;
  34.           ENDELSE
  35.      ENDFOR
  36. END
  37. float[] merge(float[][] arr)
  38. BEGIN
  39.      IF arr.length() == 1
  40.         return arr[0];
  41.      ENDIF
  42.      IF arr.length() == 2
  43.         return merge(arr[0], arr[1])
  44.      ENDIF
  45.      int len = arr.length;
  46.      int mid = len/2 - 1;
  47.      int leftPart = mid + 1;
  48.      int rightPart = len - mid - 1;
  49.      float[][] arr1 = new float[leftPart][];
  50.      flaot[][] arr2 = new float[rightPart][];
  51.      float[] result1 = merge(arr1);
  52.      float[] result2 = merge(arr2);
  53.      return merge(result1, result2);
  54. END
  55. float[] merge(float[] arr1, float[] arr2)
  56. BEGIN
  57.      List<float> list = new List<float>();
  58.      int arr1Index = 0, arr2Index = 0, arr1Len = arr1.length(), arr2Len = arr2.length();
  59.      WHILE(arr1Index < arr1Len && arr2Index < arr2Len)
  60.           IF arr1[arr1Index] > arr2[arr2Index]
  61.                list.add(arr1[arr1Index]); 
  62.                arr1Index++;
  63.           ENDIF 
  64.           ELSEIF arr1[arr1Index] < arr2[arr2Index]
  65.                list.add(arr2[arr2Index])
  66.                arr2Index++;
  67.           ENDELSE
  68.           ELSE
  69.                list.add(arr2[arr2Index])
  70.                arr1Index++;
  71.                arr2Index++;
  72.           ENDELSE 
  73.      ENDWHILE
  74.      
  75.      WHILE arr1Index < arr1Len
  76.           list.add(arr1[arr1Index]); 
  77.           arr1Index++; 
  78.      ENDWHILE
  79.      WHILE arr2Index < arr2Len
  80.           list.add(arr2[arr2Index])
  81.           arr2Index++; 
  82.      ENDWHILE
  83.      return list.toArray();
  84. END
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值