递归、迭代、回溯、广度和深度优先

在学习算法的时候,经常碰到递归、迭代、回溯、广度优先和深度优先算法,可是回溯使用了递归,深度优先也使用了递归,广度优先有是迭代,它们之间是什么关系呢。

通过几道练习题,我们可以很发现,递归和迭代是基本的算法技巧,回溯是建立在递归之上的算法思想,而广度优先和深度优先是针对图、树的特殊递归和迭代算法。

迭代和递归

在反转链表一文中,有个结论是凡是用递归完成都可以用迭代完成,反之亦然。而递归使用了操作系统栈,这个栈有限制,所以在没有尾递归优化的语言里,要慎用递归,如果可以使得表达更符合人类思考,且不会导致栈溢出,则递归也不是一定不可以用的。

例如中序遍历,使用递归是最符合人的思考理解的:

   def inorderTraversal(self, root):
        if not root: return []
        return self.inorderTraversal(root.left) + [root.val] + self.inorderTraversal(root.right)

迭代的写法,就是放弃使用操作系统栈,而自己去构造栈,是比较难思考的,而有人给了一种color的解法,使用了迭代,而且也符合人的思考过程

   def inorderTraversal(self, root: TreeNode) -> List[int]:
        white, gray = 0, 1
        res = []
        stack = [(white, root)]
        while stack:
            color, node = stack.pop()
            if not node:
                continue
            if color == white:
                stack.append((white, node.right))
                stack.append((gray, node))
                stack.append((white, node.left))
            else:
                res.append(node.val)
        return res
回溯算法

回溯算法就是建立在递归技巧上的,一般用于遍历。例如“给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合。”

这道题使用回溯算法是最直接的算法,对于1..n的数字,每个数字选或者不选,复杂度是O(2^n)。

    def combine(self, n: int, k: int) -> List[List[int]]:
        self.r, self.n = [], n
        self.backTracking(1, k, [])
        return self.r
    
    def backTracking(self, element: int, length: int, array: List[int]):
        if not length: 
            self.r.append(array)
            return
        if element > self.n: return
        self.backTracking(element + 1, length, array)
        self.backTracking(element + 1, length - 1, array + [element])

这道题还可以用递归、迭代、动态规划等方法。

广度优先和深度优先

广度优先和深度优先,是针对图、树(树是一种特殊的图)的搜索算法,算法复杂度是O(n)。深度优先就是基于递归的技巧,而广度优先则是基于迭代的技巧,但是由于可以记忆标准模版,因此训练熟悉以后比较容易写出。这里的比较容易是相对于在非图中的迭代技巧写算法。

例如“给定一个二叉树,找出其最大深度。”
使用深度优先算法:

   def maxDepth_recursion(self, root):
        if not root: return 0
        l = self.maxDepth_iteration(root.left)
        r = self.maxDepth_iteration(root.right)
        return 1 + max(l, r)

使用广度优先算法:

    def maxDepth_bfs(self, root):
        if not root: return 0
        queue, r = [root], 0
        while queue:
            newqueue = []
            r += 1
            for node in queue:
                if node.left:
                    newqueue.append(node.left)
                if node.right:
                    newqueue.append(node.right)
            queue = newqueue
        return r

熟悉模版,怎么都非常好写出来。

小结

递归和迭代,是最基本的算法技巧,需要熟练掌握,写迭代是要牢记是自己去实现栈。而回溯算法则是针对遍历这种场景,基于迭代的一种算法思想。广度优先和深度优先是针对图的特殊搜索算法。可以说,递归和迭代是基础本质,其它都是在某场景、数据结构下具体派生产物。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,869评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,716评论 3 396
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 166,223评论 0 357
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,047评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,089评论 6 395
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,839评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,516评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,410评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,920评论 1 319
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,052评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,179评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,868评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,522评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,070评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,186评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,487评论 3 375
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,162评论 2 356

推荐阅读更多精彩内容