回溯与栈如何进行深层理解

    技术2022-05-19  26

    回溯算法也叫试探法,它是一种系统地搜索问题的解的方法。回溯算法的基本思想是:从一条路往前走,能进则进,不能进则退回来,换一条路再试。  用回溯算法解决问题的一般步骤为:   一、定义一个解空间,它包含问题的解。   二、利用适于搜索的方法组织解空间。   三、利用深度优先法搜索解空间。   四、利用限界函数避免移动到不可能产生解的子空间。   问题的解空间通常是在搜索问题的解的过程中动态产生的,这是回溯算法的一个重要特性。   回溯法是一个既带有系统性又带有跳跃性的的搜索算法。它在包含问题的所有解的解空间树中,按照深度优先的策略,从根结点出发搜索解空间树。算法搜索至解空间树的任一结点时,总是先判断该结点是否肯定不包含问题的解。如果肯定不包含,则跳过对以该结点为根的子树的系统搜索,逐层向其祖先结点回溯。否则,进入该子树,继续按深度优先的策略进行搜索。回溯法在用来求问题的所有解时,要回溯到根,且根结点的所有子树都已被搜索遍才结束。而回溯法在用来求问题的任一解时,只要搜索到问题的一个解就可以结束。这种以深度优先的方式系统地搜索问题的解的算法称为回溯法,它适用于解一些组合数较大的问题.答案补充   栈(stack)在计算机科学中是限定仅在表尾进行插入或删除操作的线形表。  栈是一种数据结构,它按照后进先出的原则存储数据,先进入的数据被压入栈底,最后的数据在栈顶,需要读数据的时候从栈顶开始弹出数据(最后一个数据被第一个读出来)。  栈是只能在某一端插入和删除的特殊线性表。用桶堆积物品,先堆进来的压在底下,随后一件一件往堆。取走时,只能从上面一件一件取。堆和取都在顶部进行,底部一般是不动的。  栈就是一种类似桶堆积物品的数据结构,进行删除和插入的一端称栈顶,另一堆称栈底。插入一般称为进栈(PUSH),删除则称为退栈(POP)。 栈也称为后进先出表(LIFO表)。答案补充   1、进栈(PUSH)算法  ①若TOP≥n时,则给出溢出信息,作出错处理(进栈前首先检查栈是否已满,满则溢出;不满则作②);  ②置TOP=TOP+1(栈指针加1,指向进栈地址);  ③S(TOP)=X,结束(X为新进栈的元素);  2、退栈(POP)算法  ①若TOP≤0,则给出下溢信息,作出错处理(退栈前先检查是否已为空栈, 空则下溢;不空则作②);  ②X=S(SOP),(退栈后的元素赋给X);  ③TOP=TOP-1,结束(栈指针减1,指向栈顶)。  栈可以用来在函数调用的时候存储断点,做递归时要用到栈!答案补充   在计算机领域,堆栈是一个不容忽视的概念,但是很多人甚至是计算机专业的人也没有明确堆栈其实是两种数据结构。  堆栈都是一种数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除。  要点:  堆:顺序随意  栈:后进先出(Last-In/First-Out)  堆和栈的区别可以用如下的比喻来看出:   使用栈就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自由度小。   使用堆就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由度大。

     

     

     

     

    回溯就想走迷宫,总会遇到死胡同,所以的按原路返回做另外一种选择,重走栈就是将当前的结果保存,继续向后解决问题,一旦遇到出口,一层一层的返回来,问题就解决了,递归的思想


    最新回复(0)