时间:2014年3月30日13:12:54
1.写算法前一定要定义好他的结构,毕竟,算法脱离不了结构的限制(即便是面向对象也只能缓解这种依赖,能摆脱结构的只有接口了)
2.当我们有了一个结构至少要提供基本操作增删改查
以上2点的共同认识,结构决定算法,不同的结构有不同的优势
基础结构
我个人认为,已知的东西都是基础的,在基础的(已知的)结构上扩充,肯定要比自己想一个非主流的要好的多,不过再怎么想有1个结构永远摆脱不了--数组
这个弱到暴的东西,我们将我们的数据放在内存中,于是就有了
这个结构就是顺序存储,实现上他是最简单的,有了结构就要看操作,嗯,因为大小是固定的,可以说这家伙根本就不能直接实现删除和添加
java实现:ArrayList
为了解决这个小问题链表结构出来了
java实现:LinkedList
世界太平了,链表拯救了世界,比起数据的增多硬件根本跟不上,链表查询的问题越来越明显,于是...
复合结构
基于基础结构,通过考虑问题的不同方式,能的到不同的答案
1.我发现数据其实都是数字,我有很多不同的数据,我可以将他们转换为数字,然后用数组的方式纯起来,比如
这是一个超赞的解决方式(记得第一次笔试的时候,别人要求排序,我就这么先存进去,在读出来,被打击了),就是所需要的空间可能有点大,只要解决的空间的问题,那他就无敌了
解决问题前线观察问题,我们可以看到
嗯,如果有这么一个映射关系在里面的话,或许还有救,你可以猜到的,这个函数就是hash();
之前的索引其实就是地址,那么这里的hash值当然也可以找到地址了,所以我数组的个数与需要存的个数一直,完美的解决方式
但是这个万恶的世界让你无法找到这么一种神奇的hash函数,我们可以通过取余的方式来定位索引,却不能保证他们的值不重复,离成功不远了,解决了这个你就无敌了
1.1渣渣,我们可以使用链,hash(索引)一样的放在一个链中,然后再一个个与真值判断就像
1.2其实hash之后还可以再次hash
1.3.....
你会发现方法总是多种多样的,这就是hash算法
2.假设一个节点Node,他又一个属性next,他就是单链表,再加一个属性,previous,就是双链表,就不能是三个乃至更多的吗?
当然可以了,你发现结构的真谛了,只要你能保证他的正确性,保证能够维护他,你甚至可以在里面加上任何你想要的东西,他相当的自由,此时你心中的结构可以爆发式增长了,那评判结构的标准也该介绍一下了
在正确性,可维护性,安全性等众多的官话面前,我只告诉你一点,确定你不会被自己设计的逻辑弄混就行了
2.1在你心中潜伏的一个结构可能就是这样的,他(Node)有一个small指向比他小的数,big指向比他大的数此时
插入:按规则对比插入,newNode总在最下方
删除:
查找:
总的来说不管样,他最差不过是链表,平均下来就是比链表好
又一个超赞的想法,这个想法的学名就是Tree,他有很多子类用来不让Tree编程链表的形式
RB