zoukankan      html  css  js  c++  java
  • 关于对面大规模数据无法使用深度优先搜索的研究

    转载请说明来源。

      使用深度优先搜索(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。

  • 相关阅读:
    file is universal (3 slices) but does not contain a(n) armv7s slice error for static libraries on iOS
    WebImageButton does not change images after being enabled in Javascript
    ajax OPTION
    编程遍历页面上所有TextBox控件并给它赋值为string.Empty?
    获取海洋天气预报
    C#线程系列教程(1):BeginInvoke和EndInvoke方法
    js控制只能输入数字和小数点
    Response.AddHeader(,)
    ManualResetEvent的理解
    Convert.ToInt32、int.Parse(Int32.Parse)、int.TryParse、(int) 区别
  • 原文地址:https://www.cnblogs.com/cmyg/p/9973642.html
Copyright © 2011-2022 走看看