Algorithm
本周完成的算法题: Valid Sudoku
题目要求:
1 2 3 4 5 |
|
分析:
要完成有效性的判定,双重循环遍历是肯定要的。我们需要考虑的是如何只使用双重循环就把所有事情搞定。通过对矩阵的观察,我们发现有以下的规律:
- 当我们访问
soduku[i][j]
,通过转换顺序soduku[j][i]
,这样可以同时访问一行、一列。 - 可以通过
(i / 3) 和 (j / 3)
得到一个3x3
小方格,同时通过(i % 3) * 3 + j % 3
计算出sudoku[i][j]
在小方格中的位置。
通过以上两个规律,我们就可以在n * n
次循环中得出是否合法的结果。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
|
实现思路上算是正确的,但不是最优的哈。最优代码参考:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
|
Review
本周Review A Technique for Deciding When to Say No
人不能完成所有事情,所以我们需要对要做的事情,想要的东西做取舍。当你选择某些项的时候,也就舍弃了其他的
文章中提出了一个2-3
法则,就是说在3个关键要素中,你只能同时选择两个。比如:质量、速度和价格,只能选择两个。如果你想要质量和速度,那么价格必然就贵;你想要低价同时也想保持质量,那么速度必然受到影响;你想要低价和速度,那么质量就无法保证。
这个观点和我们程序员熟悉的CAP
理论有异曲同工之妙,同样的三个要素,不可兼得。
那么怎么样来进行选择呢?那么首先要弄明白的是你想要的到底是什么?这里要记住:你是不可能做所有事情,得到所有东西的
。
对于生活,一定不要让自己时时处于忙碌的状态,忙碌意味着你不知道你想要的是什么,你不知道对什么说不,所以你的时间被无关的事情给占有了。
Tip
在数据量大的情况下,任何系统的性能隐患都被放大直到系统崩溃。
在本周有一个算法同学写了一段类似如下的大数据处理SQL:
1
|
|
SQL 很简单,process
和 map
都是自定的函数。其中map
函数会将参数转化成一个map结构。但是在实际运行的时候发现性能很差,100亿条数据执行了9个多小时。他找我帮他看看问题在哪里?
问题其实就是map
函数导致的,这个sql每处理一条数据就会调用map
函数,就会创建一个新对象。同时因为参数比较长,会多次触发map的扩容,导致整个SQL执行99%以上的时间其实在创建map和扩容中。
当修改实现改成使用缓存以后,性能溜得飞起,只要了4分钟就完成了。
在大数据环境下,对象的创建其实是很昂贵的操作。所以像Hadoop
这样的大数据框架才会设计成对象复用。