Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/url/2.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_Set - Fatal编程技术网

Algorithm 如何执行最小拆分以满足特殊集合排序?

Algorithm 如何执行最小拆分以满足特殊集合排序?,algorithm,set,Algorithm,Set,我正在尝试创建一个算法来解决以下问题: 输入是一个未排序的集合列表,包含键对和int值。每对中的第一个在集合中是正的和唯一的。 我想找到一个分割输入集的算法,这样就可以对这些集进行排序,这样每个键的值都不会以集的顺序递减 有一个简单的解决方案,就是将集合拆分为每个单独的值并对它们进行排序,我希望在拆分的集合数量方面更有效 您是否遇到过类似的问题和/或您可以建议的技术? 在多项式时间内,最优最小分裂数解决方案听起来可能吗 编辑:在示例中* 我建议使用以找到最佳解决方案。从左到右递增地构建分割集的

我正在尝试创建一个算法来解决以下问题:

输入是一个未排序的集合列表,包含键对和int值。每对中的第一个在集合中是正的和唯一的。 我想找到一个分割输入集的算法,这样就可以对这些集进行排序,这样每个键的值都不会以集的顺序递减

有一个简单的解决方案,就是将集合拆分为每个单独的值并对它们进行排序,我希望在拆分的集合数量方面更有效

您是否遇到过类似的问题和/或您可以建议的技术? 在多项式时间内,最优最小分裂数解决方案听起来可能吗

编辑:在示例中* 我建议使用以找到最佳解决方案。从左到右递增地构建分割集的顺序,从而最小化实现此目的所需的集合数量

A*根据对总成本的一些启发式估计访问各州。我建议,一个状态是由我们到目前为止已经包含在顺序中的所有对的总和来描述的。如果每个键的所有值都不同,则只需存储每个键的最后一个值,就可以非常简洁地表示此信息。否则,您将不得不以某种方式处理相等的值,以便您知道哪些值已经包含,哪些值没有包含。对于每一个状态,您都会维护指向它的最佳顺序的一些表示,但在状态保持不变的过程中,这些表示可能会随之更新

启发式应该是对从开始到当前状态到目标的路径总成本的估计。它可能太低,但决不能太高。在我们的例子中,启发式应该计算到目前为止顺序中可能包含的拆分集的数量,并将仍然等待插入的未拆分集的数量加在一起。由于剩余的集合可能需要拆分,这可能太低,但由于您的集合永远不会少于那些仍在等待插入的集合,因此这是一种合适的启发式方法

现在您有了一些优先级的状态队列,按照这个启发式的值排序。从中提取最小的项目,并且知道从队列中提取状态的那一刻起,达到该状态的成本就不能再降低了,因此到达该状态的路径是最优的。现在,您将检查可以从中达到哪些其他状态:按照拆分集的顺序,下一个是哪些其他对?对于每个剩余的具有准备好包含的对的集合,您将创建一个新的后续状态,从集合中获取所有准备好的对。到目前为止,成本增加了一倍。如果您能够在不拆分的情况下获取整个集合,那么剩余成本的extimate将减少1

对于这个新状态,您要检查它是否已经存在于您的优先级队列中。如果是,并且它以前的成本高于刚才计算的成本,那么您将更新它的成本以及通向它的最佳路径。确保优先键相应地改变其位置“减少键”。如果该状态以前不在队列中,则将其添加到队列中

迪杰斯特拉 仔细想想,这与以拆分次数作为成本运行是一样的。由于每条边的成本为零或为一,您可以更轻松地实现这一点,而无需任何优先级队列。相反,您可以使用两个集合,称为S₀ 和S₁, 其中所有元素都来自S₀ 需要相同数量的拆分,以及来自₁ 需要再拆分一次。大致用伪代码绘制:

S₀ = ∅ (empty set)
S₁ = ∅
add initial state (no pairs added yet, all sets remain to be added) to S₀
while True
    while (S₀ ≠ ∅)
        x = take and remove any element from zero
        if x is the target state (all pairs included in the order) then
            return the path information associated with it
        for (r: those sets which remain to be added in state x)
            if we can take r as a whole then
                let y be the state obtained by taking r as the next set in the order
                if y is in S₁, remove it
                add y to S₀
            else if we can add only some elements from r then
                let y bet the state obtained by taking as many elements from r as possible
                if y is not in S₀, add it to S₁
    S₀ = S₁
    S₁ = ∅
A* 我建议使用以找到最佳解决方案。从左到右递增地构建分割集的顺序,从而最小化实现此目的所需的集合数量

A*根据对总成本的一些启发式估计访问各州。我建议,一个状态是由我们到目前为止已经包含在顺序中的所有对的总和来描述的。如果每个键的所有值都不同,则只需存储每个键的最后一个值,就可以非常简洁地表示此信息。否则,您将不得不以某种方式处理相等的值,以便您知道哪些值已经包含,哪些值没有包含。对于每一个状态,您都会维护指向它的最佳顺序的一些表示,但在状态保持不变的过程中,这些表示可能会随之更新

启发式应该是对从开始到当前状态到目标的路径总成本的估计。它可能太低,但决不能太高。在我们的例子中,启发式应该计算到目前为止顺序中可能包含的拆分集的数量,并将仍然等待插入的未拆分集的数量加在一起。由于剩余的集合可能需要拆分,这可能太低,但由于您的集合永远不会少于那些仍在等待插入的集合,因此这是一种合适的启发式方法

现在哟 你有一些优先级的状态队列,按照这个启发式的值排序。从中提取最小的项目,并且知道从队列中提取状态的那一刻起,达到该状态的成本就不能再降低了,因此到达该状态的路径是最优的。现在,您将检查可以从中达到哪些其他状态:按照拆分集的顺序,下一个是哪些其他对?对于每个剩余的具有准备好包含的对的集合,您将创建一个新的后续状态,从集合中获取所有准备好的对。到目前为止,成本增加了一倍。如果您能够在不拆分的情况下获取整个集合,那么剩余成本的extimate将减少1

对于这个新状态,您要检查它是否已经存在于您的优先级队列中。如果是,并且它以前的成本高于刚才计算的成本,那么您将更新它的成本以及通向它的最佳路径。确保优先键相应地改变其位置“减少键”。如果该状态以前不在队列中,则将其添加到队列中

迪杰斯特拉 仔细想想,这与以拆分次数作为成本运行是一样的。由于每条边的成本为零或为一,您可以更轻松地实现这一点,而无需任何优先级队列。相反,您可以使用两个集合,称为S₀ 和S₁, 其中所有元素都来自S₀ 需要相同数量的拆分,以及来自₁ 需要再拆分一次。大致用伪代码绘制:

S₀ = ∅ (empty set)
S₁ = ∅
add initial state (no pairs added yet, all sets remain to be added) to S₀
while True
    while (S₀ ≠ ∅)
        x = take and remove any element from zero
        if x is the target state (all pairs included in the order) then
            return the path information associated with it
        for (r: those sets which remain to be added in state x)
            if we can take r as a whole then
                let y be the state obtained by taking r as the next set in the order
                if y is in S₁, remove it
                add y to S₀
            else if we can add only some elements from r then
                let y bet the state obtained by taking as many elements from r as possible
                if y is not in S₀, add it to S₁
    S₀ = S₁
    S₁ = ∅

你能准确地回答你的问题吗?在您的图像中,我不明白为什么必须拆分b。@Bentoy13谢谢,是的,集合b需要拆分,因为其键100的值小于集合a的值,但其键101的值大于集合a的值。因此,它需要拆分以满足全局约束。在我的图像中,我把结果的顺序搞错了,我会纠正它。你说的,每对中的第一个是积极的和独特的是什么意思?@Picarus抱歉,我不知道如何最好地解释它。。。本质上,这些集合包含键值对,就像字典数据结构一样。因此,例如,示例中的集合a不能添加100,0,因为配对的第一项在集合中必须是唯一的。对集合中的第二项值没有限制。如果您的限制是为了序列不减少,则拆分将没有帮助。我认为你应该进一步澄清。你能把你的问题说清楚吗?在您的图像中,我不明白为什么必须拆分b。@Bentoy13谢谢,是的,集合b需要拆分,因为其键100的值小于集合a的值,但其键101的值大于集合a的值。因此,它需要拆分以满足全局约束。在我的图像中,我把结果的顺序搞错了,我会纠正它。你说的,每对中的第一个是积极的和独特的是什么意思?@Picarus抱歉,我不知道如何最好地解释它。。。本质上,这些集合包含键值对,就像字典数据结构一样。因此,例如,示例中的集合a不能添加100,0,因为配对的第一项在集合中必须是唯一的。对集合中的第二项值没有限制。如果您的限制是为了序列不减少,则拆分将没有帮助。我认为你应该进一步澄清。