每天总结

2013-08-22

  今天用户反馈邮件发送处存在一个 大 bug,真是汗颜, 居然把给每个用的不同的邀请码搞成同一个, bug层出不穷就没有停止过, 可为什么会出现呢?

 1:写代码的过程中仍然逻辑不是最清晰的,很容易忽略一些细节。

  2:测试中居然没有发现, 这是导致这次问题的最大原因,妈的,那么大的结果我都看不到,真他妈SB,  只关注了次要的东西,最主要的居然没有去验证。

  别再丢人了,真是





今天看了一个算法

Magic Index 分析:
给定一个数组A,其中有一个位置被称为Magic Index,含义是:如果i是Magic Index,则A = i。
假设A中的元素递增有序、且不重复,请给出方法,找到这个Magic Index。更进一步,当A中允许有重复的元素,该怎么办呢?


0        1        2        3        4        5        6
-10        -5        1        2        4        10        12
mid=3,A[mid] = 2,即A[mid] < mid。接下来,我们应该在哪一边查找呢?我们知道数组的元素是递增有序,且不重复的,也就是说,
在A[mid]左边的元素,比A[mid]都要小,没有重复,意味着什么呢?每向左移动一位,至少减1。
所以,在mid左边,不可能有一个i,A=i的。如果有,根据前面的分析,我们知道A[mid] - A >= mid - i, 
如果A = i,则,A[mid] >= mid, 这与事实A[mid] < mid相悖。所以,接下来,只能在右边进行查找。代码与二分查找也很像。


int find_magic_index2(int *list, int count) {
     int low = 0, high = count - 1;
     while (high > low) {
         int idx = (high + low) / 2;
         if (idx == list[idx])
             return idx;
         else if (list[idx] > idx) {
             high = idx - 1;
         }
         else 
            low = idx + 1;
     }
 
     return -1;
}

如果有重复项

如果数组A中,有重复元素,是什么情况呢?经过前面的分析,我们知道,是否有重复的主要差别在,数组的元素从右到左进行递减,每次不一定至少是1了,有可能是0了。让我们直观的看一下影响吧。


0        1        2        3        4        5        6
-10        2        2        2        9        10        12
看上面的数组,同样A[mid] < mid。我们应该继续查右边么?显然,右边并不存在Magic Index。查找右边,就会找不到这样的Magic Index。此时,应该如何处理呢?我们无法确定,Magic Index是在左边,还是在右边了。那就两边都递归进行处理吧。


在这里还有一个小技巧,我们就是要分别递归处理[0, mid - 1]和[mid + 1, end](end是数组长度-1)么?我们看一个具体的例子:


0        1        2        3        4        5        6        7        8
-10        2        2        2        2        10        12        13        20
这个例子,当我们进行左半部分递归处理的时候,需要考虑的范围是[0, 3]。可实际上,我们只需要考虑[0, 2]。原因是,数组元素在mid=4的左边的值都要小于或者等于A[mid]=2,所以最大的一个有可能是Magic Index的,就是index为A[mid]的情况。所以,这时右边的边界应该是min(mid - 1, A[mid])。


那么,右边的情况呢?如下例子:


0        1        2        3        4        5        6        7        8
-10        2        2        2        9        10        12        13        20
此时,要在右半部分进行查找,范围一般是[5, 8]。但是,由于数组有序,后面的值,一定是大于等于A[mid]=9的。所以,有可能是Magic Index的最小Index是9,也就是说右边的递归,应该是从索引为9的位置开始。此例,就意味着,无需处理右边了。


简单方法



第二个,可重复的,该怎么办?从头到尾走一边,总归是可以的嘛。:)。我的想法是,如果a[i]等于i的话,找到了;如果大于i的话,让i=a[i],不然i++继续找。这样最差的情况才是O(n)
至于为什么可以让i=a[i],原因由于数列是递增的,所以数组元素在{i, a[i]}的区间中,肯定不可能存在magic index。这样看上去是不是跳跃着前进啊。:)
int find_magic_index (int *list, int count) {
     int i=0;
     while (i<count) {
        if (list[i] == i)
            return i;
         else if (list[i] > i)
             i = list[i];
         else
             i++;
     }
     return -1;
}




2013-08-23

安装widowns版python

做小游戏

http://coolshell.cn/articles/4710.html

http://blog.jobbole.com/46308/

http://eyehere.net/2011/python-pygame-novice-professional-1/

http://eyehere.net/2011/python-pygame-novice-professional-1/


说服他人

  1. 先给予,后索取 (Be the first to give )。研究表明,我们容易被给我们帮过忙的人说服:有些服务员给我们结账的时候带来口香糖,我们一般给他们的小费多些。工作中我们更倾向于给帮助过我们的人更多支持…
  2. 不要给对方太多选择 (don’t offer too many choices):不论是给用户选择,还是给员工的奖励机制,太多的选择经常会给人带来挫折感…
  3. 不要以自我为中心辩护(argue against self-interest)。在说服别人的过程中,信任是最关键的。有时候在大力鼓吹之前承认自己方面的一些小不足可以提高信任感…
  4. 失去比得到更有说服力 (losses are more persuasive than gains)。告诉对方如果不接受你的意见或者不买的你的产品会失去什么,要比只是说明他们会得到什么要更能说服人…
  5. 让对方觉得自己已经取得了一定进步 (make people feel as if they’ve already made progress toward a goal)。例如以下两种推销洗车会员卡服务的方法,方法2的顾客保持率是方法1的两倍。
    1. 洗八次赠一次
    2. 洗十次车赠一次,第一次算免费赠送

你可能感兴趣的:(每天总结)