大數據算法學習筆記(5)-有序數組的判定

代碼

Java

import java.util.Arrays;
import java.util.Random;

public class IsOrder {
    public static void main(String[] args) {
        double epsilon = 0.4;
        int[] array = new int[]{1,2,7,3,4,8,5,6};
        int k = (int)(2/epsilon);
        int[] samples = Arrays.copyOfRange(array, 0, k);//這裏應該是保持順序的抽樣,我簡化了
        Random random = new Random();
        int i = random.nextInt(samples.length);
        System.out.println(i+":"+samples[i]);
        System.out.println(Arrays.toString(samples));
        System.out.println(binarySearch(samples,0, samples.length, i));
    }
    //關鍵是這個二分查找
    private static boolean binarySearch(int[] samples,int start, int end, int i){
        if (end<=start) return true;
        int mid = start+(end-start)/2;
        if (mid > i && samples[mid] < samples[i]) return false; //i後面的比sample[i]小
        if (mid < i && samples[mid] > samples[i]) return false;//i前面的比sample[i]大
        return binarySearch(samples, start, mid,  i) && binarySearch(samples,mid+1,end, i);

    }
}

Scala

import scala.util.Random

object IsOrder2 {
  def main(args: Array[String]): Unit = {
    val epsilon = 0.4
    val array = Array(1, 2, 7, 3, 4, 8, 5, 6)
    val k = (2/epsilon).toInt
    val samples = array.take(k) //這裏應該是保持順序的抽樣,我簡化了
    val i = Random.nextInt(samples.length)
    println(i+":"+samples(i));
    println(samples.mkString("\t"))
    println(binarySearch(samples,0, samples.length, i));
  }
  def binarySearch(samples:Array[Int], start:Int, end:Int, i:Int):Boolean={
    if (end<=start) return true;
    val mid = start+(end-start)/2;
    if (mid > i && samples(mid) < samples(i)) return false; //i後面的比sample[i]小
    if (mid < i && samples(mid) > samples(i)) return false;//i前面的比sample[i]大
    return binarySearch(samples, start, mid,  i) && binarySearch(samples,mid+1,end, i)
  }
}

Python

import random
def binarySearch(samples, start, end, i):
    if end <= start: return True
    mid = start + (end - start) // 2
    if mid > i and samples[mid] < samples[i]: return False # i後面的比sample[i]if mid < i and samples[mid] > samples[i]: return False # i前面的比sample[i]return binarySearch(samples, start, mid, i) and binarySearch(samples, mid + 1, end, i)
epsilon = 0.4
array = [1, 2, 7, 3, 4, 8, 5, 6]
k = int(2/epsilon)
samples = array[0:k] # 這裏應該是保持順序的抽樣,我簡化了
i = random.randint(0, len(samples))
print(i, samples[i])
print(samples)
print(binarySearch(samples, 0, len(samples), i))



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章