【问题标题】:Implementing a breadth first search with rxjs Observables使用 rxjs Observables 实现广度优先搜索
【发布时间】:2021-11-13 07:41:24
【问题描述】:

我试图实现的东西并不完全是广度优先搜索,但它与常见的广度优先搜索的实现方式相似。当尝试使用广度优先搜索找到最短路径时,您从一个具有起始节点的队列开始,弹出该节点,然后将该节点的子节点添加到队列中,继续循环。当你找到你正在寻找的结束节点时,你停止执行/从队列中弹出东西。

我想要做的是有一个可以订阅的外部 Observable。当有人订阅时,它会启动一个内部 Observables 的基本队列。随着这些可观察对象的运行,它们会将其他可观察对象添加到内部可观察对象的队列中。如果在可观察执行期间的某个时刻达到了我正在寻找的值/场景,我想发出该值并完成外部可观察。如果没有找到值/场景,我想发出 null 并完成外部 observable。人们对我可以用来完成这样的事情的内置 rxjs 魔法有什么建议吗?我一直在查看queueScheduler,我认为这可能会有所帮助,但我不知道当我用完事件时如何返回null。当队列中没有任何内容时,我需要它自行完成,然后触发,以便我可以完成订阅者的外部 observable。如果我找到我想要的值/场景,我还想取消任何排队的操作。

【问题讨论】:

  • 我不明白你为什么要为此使用 observables,尽管这很可能是有充分理由的——这种方法有什么例子或灵感吗?

标签: angular algorithm rxjs logic


【解决方案1】:

我相信您可以通过结合常用的 rxjs 运算符(concatswitchMap)等来获得您想要的大部分内容。当订阅被取消订阅时,它将依次取消订阅每个 observable,因此生产者并不真正需要知道消费者已经找到了它正在寻找的价值。

我写了一个例子on stackblitz。 使用 filtertake(1)toArray 运算符,它会将找到的值作为单例数组或空数组发出,然后完成。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-06-02
    • 1970-01-01
    • 1970-01-01
    • 2011-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多