摘要:
有n个士兵,每个士兵知道不同的军事秘密,每两个士兵可以通过一次交流来互相知晓对方掌握的信息,现设计最优的策略来使得通过最少的交流次数使所有士兵知道所有军事秘密,并给出最优策略所需的交流次数。(给出算法思路,计算次数)网络思路:使用归并法,设前n/2个士兵组成的集合A互相知晓集合内所有士兵的秘密,不知道其他任意士兵的秘密,后n/2个士兵组成的集合B也只知道自己集合内部的所有秘密。从集合A中取一个士兵a,从集合B中取一个士兵b,让a、b互相交流之后,则a、b知道了所有的军事秘密,经过n/2次上述操作后,算法完成。对于集合A内部的士兵,用同样的方法分为两个小集合进行同样的操作。基本操作和归并排序类似 阅读全文
摘要:
阿里的题目:有n-1个群众和1个明星,群众两两间可能认识也可能不认识,但是群众都认识明星,明星不认识其他任何人。现在每次询问一个人是否认识另一个人的时间复杂度是O(1),要求找出明星的时间复杂度。笔试时,完全不知道在写什么。题目似乎都没有分析清楚。胡搞了一番,老是对着“群众都认识明星”这个point思考。结论就是O(n^2),晕。其实,切入点应该为“只有一个明星,群众都认识明星,明星不认识群众”(说等没说),引用网络得出的一个重要的结论:首先分析一次询问的效果。is A 认识 B? (yes) A不是明星,B可能是明星 : (no) A可能是明星,B是群众。所以一次询问可以确定一个人。所以一次 阅读全文
摘要:
链表是每一个程序员必学的一个数据结构。理解上并不是很难,但是它却很常用。所以我们为了避免重复造轮子,所以一个好的设计就显得格外的重要了。如果在C++中我们可以很容易的想到模板编程。可是在纯C的环境下就没有什么简单了。为了避免重复的工作,先把工作中重复的部分提取出来。比如说是循环双向链表。每一个节点包含了前一个元素指针和后一个元素的指针。为了操作的便利,我们会使用到带头节点的方式。前后指针的是每一种循环双向链表节点要包括的数据结构,所以就可以想办法把其抽离出来,这里给出了linux下的list的实现的简版。(如果你参与过window下的驱动开发,应该也会发现这种实现方式的list) 1 #in. 阅读全文