- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个数据结构,其中包含如下图所示的图形:
在这棵树中,一个节点可以从它下面的层级中拥有任意数量的唯一子节点。图中的树代表一组路径。其中每条路径都应从级别 1 的节点开始,并以“*”标记的节点结束。所以图中树的路径是:
A then C then G
A then C then G then J
A then D then G
A then D then G the J
A then D then K, and so on...
实际上我的原始树很大(大约 200 万个序列),每个级别的最大节点数是 61(共 11 个级别)。所以它在我的应用程序(SAMSUNG 的计算机视觉应用程序)中导致了很多内存消耗问题。
我的目标是拥有一个迭代算法,以更紧凑的字符串格式表示这些路径。所以我觉得我们把问题分为如下三个步骤。我已经构建了树数据结构(第 2 步),但仍然无法推导出在第 3 步中从树中获取输出字符串/序列的迭代算法。
(A C G) | (A C G J) | (A D G) | (A D G J ) | (AD K) | ....
,
其中“|”代表备选方案。
(A (C G [J]) | (D (G [J]) | K)) | (B ....)
.
哪里哪里“|”代表备选方案,“[]”包含选项。应该优化目标输出字符串,因为没有更多的共同因素可以用来进一步简化它。
最佳答案
您可以使用迭代 DFS 的修改版,它利用堆栈来跟踪未处理的节点。该算法从不会为任何一个节点在堆栈* 中存储超过 6 个字符,并且堆栈中的节点总是少于 N 个(其中 N 是图中的节点数)。您已经指出 N 最多为 61*11=671,因此堆栈上最多可能有大约 4000 个元素。
在下面的伪代码中,“目标”节点是上面示例中的星号节点,例如G*.
初始化:
虚拟节点 Φ 被引入,其中一条边从 Φ 到每个“根”节点,例如上面的节点 A 和 B。 Φ 的标记被假定为非打印字符,或者您可以在将其添加到输出字符串之前明确检查。调用函数前节点Φ入栈。
outString := ""
while stack not empty
pop token
if token is node
outString := outString + node(token) // Line 5 - explanation below
if node(token) has children
if node(token) is destination
outString := outString + "["
push "]"
end
if node(token) has multiple children
for each child of node(token), from right to left
push ")"
push child
push "("
push "|"
end
pop // remove last "|"
else
push child
end
end
else // token is ()[]|
outString := outString + token
end
end
此算法对于图的第一部分(A 及其子项)的输出是(为清楚起见添加了额外的空格;这些空格可以轻松添加到代码中):
A (C G [J]) | (D (G [J]) | (K))
您会注意到您的结果与我的结果之间存在偏差:在我的解决方案中,最终节点 K 括在括号中。如果这是不可取的(它可能导致丑陋,如 A[(B)|(C)]
),您可以通过在从堆栈中弹出节点 token 时执行额外检查来消除它一些额外开销的成本。只需将上面的第 5 行替换为:
if (node(token) has no children
AND last character of outString is "("
AND next token on stack is ")")
remove trailing "(" from outString
concatenate token to outString
pop ")" from stack and ignore
else
outString := outString + node(token) // as above
end
如果您有任何问题或我遗漏了什么,请告诉我。
* 这将发生在节点被写为 |[(A)]
的情况下(可能极不可能)。大多数节点将在堆栈中占用 4 个或更少的字符。
关于c - 需要图形路径抽象算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16342579/
我对 java 中的抽象有点困惑。 我查了很多页面说抽象就是数据隐藏(隐藏实现)。 我对抽象的理解是它是“部分实现”。只需在抽象类/接口(interface)中定义您需要的内容,然后扩展/实现它们并添
我是 Ruby 的新手,主要来自 C# 和 ActionScript 3(以及其他语言)。我对抽象功能很好奇。具体来说,包装和抽象 Ruby 的 FTP 和 SFTP 库。 我四处搜索,发现了一个名为
目录 Java基础知识(抽象) 抽象 抽象定义 abstract的使用 定义抽象类
这个月我花了一些时间与 Emacs Lisp 进行斗争,试图获得更好地满足我需求的自动缩进。令人惊讶的是,大多数缩进代码是多么低级。我只看到了很少的抽象,例如 搜索不在字符串或注释中的第一个正则表达式
我有以下内容: public abstract class Foo{ //contents of Foo // ... public class Bar extends
我有三个类(class)(A 类、B 类和 C 类)。 类 A 调用 B 的实例并运行 start()。 B类扩展了Thread,因此当调用start()时,run()方法中的任何内容都会被执行。 在
这个问题已经有答案了: Calling a subclass method from superclass (5 个回答) 已关闭 7 年前。 Klasse1是一个抽象类,有一个 foo()方法。 K
我有一个这样的函数: def test(): x = "3" # In actual code, this is computed if x is None: retu
我有两个基类之间的关系: public abstract class RecruiterBase { // Properties declare here // Constructors de
这是我第一次发帖,但我遇到了很多问题。我目前有一个带有标题的 AbstractDevice 类: public abstract class AbstractDevice> implements De
我有一个 MotorDefinition 类和一个名为 Motor 的抽象类: class MotorDefinition { public: MotorDefinition(int p1,
是否有任何方法可以在这种代码(sass)中制定 css 的抽象规则: #cottage-image-gallery input:nth-of-type(1):checked ~ label:nth-o
是否可以声明一个已知的基类型并允许传输所有派生类型? [ServiceContract] public interface IService { [OperationContract]
我目前正在为基于 Java 的文本游戏开发角色生成机制,但我遇到了一个问题,看不出哪里出了问题。我有一个“Character”类,它是抽象的,然后是另一个类“NPCharacter”,它是建立在这个之
抱歉,标题令人困惑。不太确定如何表达它,这可能是问题所在! 我正在寻找一个好的抽象来用于涉及并发线程的情况。 我已经接近了,但还不是很清楚。 稍微简化一下,我在 Android 手机上收集了两种传感器
提前感谢您阅读本文。我不完全理解如何/何时使用摘要,所以我试图在我从事的每个项目中考虑它,看看它是否会在某一天全部点击 Smile | :) 此外,可访问性级别(私有(private)、 protec
我正在探索用于生成 Web 内容的 XML -> XSLT -> HTML 模因。我的 XSLT 经验很少。 我很好奇 XSLT 中有哪些机制可用于处理抽象或“重构”。 例如,使用通用 HTML 和服
在这些谈话中 Nicholas Zakas和 Addy Osmani他们讨论了在构建大型 Javascript 应用程序时将外观模式用作沙箱的想法,以便将应用程序与底层基础库分离。 这种解耦理论上允许
我使用C++和CUDA/C,想为特定问题编写代码,但遇到了一个非常棘手的简化问题。 我在并行编程方面的经验不容忽视,但相当有限,我无法完全预见到此问题的特殊性。 我怀疑是否有一种方便甚至“轻松”的方式
假设我有: trait A class B extends A class C extends A 有没有办法配置类型参数: class Foo[AType <: A with canCreateIn
我是一名优秀的程序员,十分优秀!