Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 测量流算法_Algorithm_Survey - Fatal编程技术网

Algorithm 测量流算法

Algorithm 测量流算法,algorithm,survey,Algorithm,Survey,我必须编写一个工具,允许业务用户创建调查。 只有在填写调查的人以特定方式回答了前面的问题时,才应询问一些问题。但是,无论选择的答案是什么,都应该显示一些问题 到目前为止,我提出了一个图形结构,下面是一个理论上的例子: (我只有图论的基本知识,所以请原谅我选择的单词可能不够准确) 像A、B、C这样的轮代表问题,链接上的值代表访问问题的先决条件 NULL表示没有前提条件,而“0”或“1”等值表示前一个问题必须有一个值为“0”或“1”的答案才能显示该问题 具体例子: 我在A轮。我有两个可能的答案。第

我必须编写一个工具,允许业务用户创建调查。 只有在填写调查的人以特定方式回答了前面的问题时,才应询问一些问题。但是,无论选择的答案是什么,都应该显示一些问题

到目前为止,我提出了一个图形结构,下面是一个理论上的例子:

(我只有图论的基本知识,所以请原谅我选择的单词可能不够准确)

像A、B、C这样的轮代表问题,链接上的值代表访问问题的先决条件

NULL表示没有前提条件,而“0”或“1”等值表示前一个问题必须有一个值为“0”或“1”的答案才能显示该问题

具体例子: 我在A轮。我有两个可能的答案。第一个值为“0”。第二个值为“1”。如果我选择值为“0”的答案,那么我将转到问题B

我现在在B轮。无论答案是什么,我都会进入E轮,因为没有先决条件

E是一个叶节点,所以我回到B。B有另一个子节点F,没有先决条件,所以我转到问题F。让我们在这里结束流程

我也可以问一个有多个前提的问题。这由问题N表示。只有在问题F的答案为“5”且问题I的答案为“DE”时,才能访问该问题。在这种情况下,在回答问题F后,由于在此状态下只有一个前提条件有效,因此我们将返回到图中,只有在回答问题I的“DE”后,我们才能转到问题N

我的问题是关于用于此类调查的算法。是否存在覆盖此用例的现有算法?我认为这看起来像DFS图遍历,但条件使我怀疑

还有,我是否把事情过度复杂化了,这能更简单地表达出来? 在这个阶段我真的很想得到一些建议


谢谢你的帮助

以下是我对如何解决您的问题的总体看法

根据您提供的图表,我假设对于每个问题(节点),您可以针对给定的答案判断哪些问题(节点)可能被解锁。我所说的“可能解锁”是指他们实际上解锁了,或者你刚刚满足解锁问题的条件之一

另一方面,您可以为每个问题存储解锁所需满足的条件数(让我们将其命名为计数器)。然后,每当你得到一个答案时,你检查可能被这个答案解锁的问题列表,并减少它们的计数器

当任何计数器减为零时,您将未锁定的问题添加到队列或堆栈中(您可以选择是选择FIFO顺序还是LIFO顺序)。当然,您可以从包含无条件问题的队列开始(在您的案例中只有“A”)


使用FIFO(队列),您将获得类似BFS的遍历图的顺序。使用后进先出(stack),您将获得类似DFS的订单。只要您方便。

根据您的描述,我会将您提出的图形概念稍微更改为以下内容:

  • 使其成为一个有向图(即,每个弧都有一个源和一个目标的图)
  • 每个问题有一个节点,每个答案有一个节点(每个问题的每个答案都是不同的节点)。每个问题节点需要有一个标志来确定它是“问题类型”还是“答案类型”,以及一个标志来标记它是否已被访问
  • 每个问题节点将连接到其每个答案(方向[question]->[Answer])
  • 每个答案前提条件(“要达到问题B,您需要回答问题A中的0”)将由一个答案(节点[问题A的答案0])到它“解锁”的问题(节点[问题B])的弧表示。如果一个问题需要多个答案,它将有多个输入弧
  • 每个问题的前提条件(“要达到问题D,您需要回答问题A,无论选择如何”)将由一个问题(节点[问题A])到另一个问题(节点[问题D])的弧表示
然后,算法将沿着以下路线进行:

  • 拥有一堆未决节点P,其中最初包含与调查的第一个问题相对应的节点
  • 弹出P,Q的第一个元素,它应该始终是一个问题节点,并将其标记为已访问
  • 获取Q(通过传出弧连接到当前节点的节点)的后续节点列表,并将其拆分为“回答后续节点”QtoA和“问题后续节点”QtoQ
  • 将QtoQ中的所有元素添加到P(如果有任何方法可以对这些元素进行排序,例如通过某个“问题id”,请确保以第一个元素在堆栈顶部结束的方式添加它们)
  • 提问(您甚至可以将问题存储在图表中,并从中检索所需的所有信息)
  • 从QtoA获取所选答案A的节点,将其标记为已访问,然后依次收集其所有后续答案A的列表AtoQ
  • 对于AtoQ中的每个节点R(再次考虑,如果有任何排序),如果所有R的前辈(即通过传入弧连接到R的节点)被标记为访问的,则将R添加到P.
  • 如果P中有任何节点,请转至步骤2
  • 这应该重现您描述的顺序。如果您希望能够获得多个可能的解锁答案(例如,“如果您回答1或2,您将从A转到B”),则需要进行更多调整(即,在步骤6中,您需要将R的“答案类型”前置项的“已访问”检查替换为类似的内容“可以通过访问的节点从R的前一个节点访问R”),但仍然可以使其工作

    也许你已经知道了,但我