如何在不改变算法代码的情况下可视化算法?

时间:2012-04-05 22:15:12

标签: java visualization

我想想象两种不同的算法,它们决定了Java中一个平面中圆圈集合是否重叠:

  • 检查每个圆圈组合的O(n²)算法
  • 使用扫描线的O(nlogn)算法

有没有办法让一个vizualization类的对象“监听”算法类的一个对象,例如它可以看到算法何时在一对圆圈之间执行重叠检查并知道何时更新可视化?

其他例子: 我可以保持活动圆列表(与扫描线相交的那些)作为扫描线算法的变量,让另一个类(可视化类)获得该变量。但是,该类如何知道列表何时更新并且必须更新可视化?

这只是我想到的策略。也许还有更好的方法......

3 个答案:

答案 0 :(得分:1)

也许阅读Observer模式可以帮助您:https://en.wikipedia.org/wiki/Observer_pattern

您可以实现java.util.Observer或为算法提供回调函数/对象。

您可以将观察者的任意数据交给观察者,足以让它确定算法何时执行重叠检查。

答案 1 :(得分:1)

我不确定这是否会对你有所帮助,但如果你不能改变算法的代码来支持观察者,那么一个(有趣的)选择就是研究面向方面的编程。 / p>

例如,在AspectJ中(例如参见http://en.wikipedia.org/wiki/AspectJ),您可以指定(使用称为“切入点”的地方)(称为“连接点”),其中应运行多个额外代码(称为“建议”) 。您可以使用它来检测算法执行的重叠检查,并在您认为合适时对其进行响应。

当然,以这种方式做事会涉及到使用AspectJ,所以只使用普通的Java是不可能的 - 但这可能是你想要研究的有趣内容。

答案 2 :(得分:0)

  1. 具有表示圆(以及此问题/算法中存在的任何其他对象)的类,并包含每个操作的方法。
  2. 实现算法作为对(1)对象的操作 - 作为对方法的调用。
  3. 创建一个可视化类,用于检查1中的对象,并在每个 - 比如Update()方法上显示它们的状态。
  4. 创建(1)中所有类的子类,除了原始行为之外,它们在每个操作上调用Visualization.Update()
  5. 用(4)类构建“你的世界”而不是(1)进行可视化。