RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 766768
Accepted
Rennorb
Rennorb
Asked:2020-01-05 14:17:13 +0000 UTC2020-01-05 14:17:13 +0000 UTC 2020-01-05 14:17:13 +0000 UTC

无法将用于查找图中所有路径的递归算法转换为迭代算法

  • 772

你好!有一个递归函数可以找到图中的所有路径:

func (this *Graph) FindPath(from Word, to Word, visited Dict, current Path) {
    if from.Eq(to) {
        if len(current) > this.Max {
            this.Max = len(current)
            fmt.Println(current)
        }

        this.Pathes = append(this.Pathes, current)
        return
    }

    if visited.Index(from) != -1 {
        return
    }

    index := this.nodes.Index(from)

    if index == -1 {
        return
    }

    for r := 0; r < len(this.rules); r++ {
        index := from.Index(this.rules[r].Pat)

        if index == -1 {
            continue
        }

        vis := make(Dict, len(visited))
        copy(vis, visited)
        vis = append(vis, from)

        cur := make(Path, len(current))
        copy(cur, current)
        cur = append(cur, this.rules[r])

        this.FindPath(from.ApplyRule(this.rules[r]), to, vis, cur)
    }
}

我试图让它迭代:

func (this *Graph) FindPathes(from Word, to Word) {
    this.Pathes = make([]Path, 0)
    this.Max = 0

    nodes := stack.New()
    pathes := stack.New()
    visiteds := stack.New()

    nodes.Push(from)
    visiteds.Push(Dict{from})
    pathes.Push(make(Path, 0))

    for nodes.Len != 0 {
        curn := nodes.Pop().(Word)
        curp := pathes.Pop().(Path)
        curv := visiteds.Pop().(Dict)

        if curn.Eq(to) {
            if len(curp) > this.Max {
                this.Max = len(curp)
                fmt.Println(curp.ApplyVerbose(from))
            }

            this.Pathes = append(this.Pathes, curp)
            continue
        }

        for r := 0; r < len(this.rules); r++ {
            index := curn.Index(this.rules[r].Pat)

            if index == -1 {
                continue
            }

            newword := curn.ApplyRule(this.rules[r])

            if curv.Index(newword) != -1 {
                continue
            }

            newp := make(Path, len(curp))
            copy(newp, curp)
            newp = append(curp, this.rules[r])

            newv := make(Dict, len(curv))
            copy(newv, curv)
            newv = append(newv, newword)

            pathes.Push(newp)
            nodes.Push(newword)
            visiteds.Push(newv)
        }
    }
}

stack - 堆栈的自写实现,假设一切都在那里正常工作。

单词-[]int
字典-[]Word
路径-[]Rule
规则-struct{Pat Word, Rep Word}

Index - 用于Dict并Path返回所需元素的索引(或 -1),以及 for Word- 子字符串开始的位置(或 -1)。

Word.Eq - 检查两个单词是否相等。

第一个函数正常工作,但第二个函数没有在合理的时间内完成。你可以帮帮我吗?

алгоритм
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    Rennorb
    2020-01-12T01:18:53Z2020-01-12T01:18:53Z

    在第一段代码中有一行:

    index := this.nodes.Index(from)
    
    if index == -1 {
        return
    }
    

    第二个没有类似的东西。有必要newword在声明后添加相同的条件:

    if this.nodes.Index(newword) == -1 {
                    continue
    }
    

    现在一切正常。重要的一点:迭代函数至少快三倍。

    • 0

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    是否可以在 C++ 中继承类 <---> 结构?

    • 2 个回答
  • Marko Smith

    这种神经网络架构适合文本分类吗?

    • 1 个回答
  • Marko Smith

    为什么分配的工作方式不同?

    • 3 个回答
  • Marko Smith

    控制台中的光标坐标

    • 1 个回答
  • Marko Smith

    如何在 C++ 中删除类的实例?

    • 4 个回答
  • Marko Smith

    点是否属于线段的问题

    • 2 个回答
  • Marko Smith

    json结构错误

    • 1 个回答
  • Marko Smith

    ServiceWorker 中的“获取”事件

    • 1 个回答
  • Marko Smith

    c ++控制台应用程序exe文件[重复]

    • 1 个回答
  • Marko Smith

    按多列从sql表中选择

    • 1 个回答
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Suvitruf - Andrei Apanasik 什么是空? 2020-08-21 01:48:09 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5