Kata02:只有10%程序员能写对的二分查找

CodeKata02地址

继续做CodeKata。

第二个Kata要求很简单:二分查找。现在不懂二分查找的程序员恐怕不多了吧?不过二分查找还有一段趣事。

只有10%程序员能写对二分查找

这个结论出自著名的《编程珠玑》,相关内容可以看这里:http://www.csdn.net/article/a/2010-04-23/218099

文中让我感触最深的一句话是“ in an age when programmers spend more time plugging libraries together than writing actual code, core algorithmic skills are likely if anything to have declined”,千万不要成为一个只会堆砌库的泥瓦工。

let's rock

当然,作为一个Kata,绝对不可能只要求二分查找这么简单,作者要求的是写出5种不同的二分查找。

前两种地球人都能想到:递归和迭代。

我们的代码太丑了,放一个写完之后Google出来的代码吧,大概是我们代码的一半长:

function binary_search_iterative(value, a) {
    var lo = 0, hi = a.length - 1, mid;
    while (lo <= hi) {
        mid = Math.floor((lo+hi)/2);
        if (a[mid] > value)
            hi = mid - 1;
        else if (a[mid] < value)
            lo = mid + 1;
        else
            return mid;
    }
    return -1;
}

对了,我们用的是JavaScript。

这段代码的重点是hi = mid - 1lo = mid + 1,这两句中的+1-1有两个作用:避免死循环以及优化性能,至于为什么能做到这两点,请大家自己思考一下~

Kata中给出了一些测试用例,我们写了一个测试函数方便使用:

var test = function(fn) {
    var test_data = [
        [-1, [3, []]],
        [-1, [3, [1]]],
        [0, [1, [1]]],
        [0, [1, [1, 3, 5]]],
        [1, [3, [1, 3, 5]]],
        [2, [5, [1, 3, 5]]],
        [-1, [0, [1, 3, 5]]],
        [-1, [2, [1, 3, 5]]],
        [-1, [4, [1, 3, 5]]],
        [-1, [6, [1, 3, 5]]],
        [0, [1, [1, 3, 5, 7]]],
        [1, [3, [1, 3, 5, 7]]],
        [2, [5, [1, 3, 5, 7]]],
        [3, [7, [1, 3, 5, 7]]],
        [-1, [0, [1, 3, 5, 7]]],
        [-1, [2, [1, 3, 5, 7]]],
        [-1, [4, [1, 3, 5, 7]]],
        [-1, [6, [1, 3, 5, 7]]],
        [-1, [8, [1, 3, 5, 7]]],
    ]
    for (var i in test_data) {
        console.log(test_data[i][0] == fn.apply(this, test_data[i][1]))  // 把array当作参数传入函数
    }
}

test(binary_search_iterative)

使用的时候直接test(your_function)就可以了。

两种搞定,第三种文中给出了提示:用函数式编程。

函数式编程

函数式编程到底是什么呢?我们看了一些资料,仍然没有理解,不过大体上来说,函数式编程是一种思想,并不是说一定要用haskell、scala才能进行函数式编程,很多语言都可以,就像设计模式和语言无关一样。

函数式编程水太深,我们找了一些不错的学习资料,准备等学会之后再来实现。

  • Purely Functional Data Structures
  • Learn You a Haskell for Great Good!
  • Real World Haskell

这三本都是很不错的函数式编程学习材料,之所以选择haskell,是为了逼自己用函数式编程的思维来编程。不过最近应该是没时间学习了,先存下来,之后一定会学。

我没有特殊的二分查找技巧

第三种也勉强算搞定吧,这第四第五种可真是难倒我们了,两个人想了两天也没搞定,最后只得作罢。如果大家有想法的话一定要告诉我们啊!

虎头蛇尾

这个Kata总觉得不爽,似乎是太简单了,又似乎是自己会的太少了,有一种使不上力的感觉。不过通过这个Kata记住了一种二分查找的简洁实现方法,还找到了函数式编程的学习资料,也算有所收获吧。

你可能感兴趣的:(Kata02:只有10%程序员能写对的二分查找)