关于对面大规模数据无法使用深度优先搜索的研究

转载请说明来源。

 

  使用深度优先搜索(DFS depth first search)时,第一时间拓展可以拓展的点,每拓展一个新的点,从汇编的角度考虑,需要调用新的子函数,即开辟一个内存空间存放指令,把原来的CS:IP(段地址:偏移地址)压入栈(这里不考虑标志位的入栈,其原理与CS:IP是一致的,不考虑子函数的局部变量存储,其存储方式与CS:IP不同),直到新的点也扩展完毕,原来的CS:IP才出栈,代替目前的CS:IP。

 

  有一道题,求从图中的某一个点出发,能够到达的所有的点的数目。特殊情况是共有n个点,从点1出发,而点1只与点2相连,点2只与点3相连,$\cdots$,点n-1只与点n相连,即最多共有n个子函数同时存在,栈里也需要存储n个不同的CS:IP地址。以8086的栈为例,大小为10000H字节,而一个CS:IP大小为4个字节,最多只能存储16384(D 十进制)个CS:IP。可怕的是,8086的栈是循环的(同一个栈的所有位置都是段地址相同的),栈顶的下一个位置为栈底(栈顶的偏移地址加1,忽略进位后的值为栈底的偏移地址),可能导致新的CS:IP覆盖了第一个子函数的CS:IP,导致程序陷入死循环,无法结束。而一般系统的栈也不会特别的深,对于很大的数据量,完全无法满足要求。

 

  在编程评测时,面对这样的情况,评测结果为内存超限(MLE memory limit exceeded)。栈的使用内存超出一定规定限制,就直接退出,不再执行。这是出于减少评测时间的需要,更重要的是,这是一种保护机制,避免程序把评测机弄崩。要注意的是,内存的使用不仅仅包括栈(容易被忽略),同时也包括数组,STL(容易被忽略,计算不准)等。如使用vector,就比使用链表耗费更多的内存。

  

  类似的问题还有很多,比如对n*m地图的搜索。反正遇到搜索深度很大的题目,请勿使用DFS。

posted @ 2018-11-17 13:31  congmingyige  阅读(247)  评论(0编辑  收藏  举报