由于一直在学习状态机,其知识量之大,确实是我所想象不出来的,最近在论坛里看问题,只要是能和状态机相关的,我都会仔细的捉摸。其中要想学会状态机,对内存的把握,对数据管理的把握,尤其是对数据结构的把握都是相当基本的要求。说来惭愧,学了这么长时间。还是不得其门而入,虽然写了一些程序,总结了一些东西,但是总是和自己所希望的相去甚远。但是进步总是在潜移默化当中发生的,只要肯好好努力,收获还是有的。习惯了定一个目标,做一个计划,之后努力去实现它,但这次真的感觉有点累。为了那遥不可及的目标,还是需要默默的走下去!状态机我真爱死你了,欲罢不能。
呵呵扯远了,还是言归正传吧,昨天早上在论坛里看到了一个帖子
http://topic.csdn.net/u/20090920/21/8997ec64-c81d-426f-a714-575f3db06b9d.html
大致要求如下:
(1).存在数据列表,格式为,每一行为一个对象
x,y,width,height,zorder
0,0,10,20,1
2,2,30,20,2
...
...
(x,y,width,height)确定一个正方形,zOrder层次
(2).要求给定1点(x,y),找出包含该点的所有对象.并按zOrder大小从大向小排
(3).要求给出一个正方形(x,y,width,height),找出包含该正方形内的所有对象
(分两种情况1.完全包含.2不完全包含(只要一部分在方向内就行))
(4)自已定义数据结构和存放形式,要求算法复杂度尽可能小,不要给一个要求全部遍历判断的方式.
最好在O(1)或O(log2n),因为方法调用频度高和N很大(100000)
总结一下吧,最开始我的方法10万的数据,我最开始的搜索方法需要600多个ms,到后来的百万数据只需要几十个ms的时间,所有我用到的东西,除了算法,几乎都是我最近学习状态机练出来的。其中第一个方法从面对问题,到想方法,到编码,最后到测试,我只花了不到三个小时的时间,我个人对这个结果是很满意的,虽然我感觉自己的进步很慢。我建议大家多学习学习状态机,开阔一下视野(当然或许许你已经不需要了),最起码要知道,不是编译原理包含状态机,而是状态机包含编译原理,词法分析器也只是状态机的一种应用。状态机比想象的广的多的多。
最后贴一下代码,大部分想法都已经在那个帖子里说了,这里只概略的总结一下:
方法一:遍历链表,基本上要搜索所有数据