【问题标题】:Optimizing item order in an ArrayList优化 ArrayList 中的项目顺序
【发布时间】:2018-06-14 15:16:40
【问题描述】:

我有一个颜色及其出现频率的 ArrayList。我的程序应该计算使两个相等的砖块之间的最小距离最大化的那些项目的重新排序。

例如,给定输入由 4*brick 1 (x)、3*brick 2 (y) 和 5*brick 3 (z) 组成,一个正确的输出应该是:z y x z x z y x z x y。

我的代码没有产生好的解决方案。特别是,有时最后有 2 个相等的砖块,这是最坏的情况。

import java.util.ArrayList;
import java.util.Collections;

public class Calc {
    // private ArrayList<Wimpel> w = new ArrayList<Brick>();
    private String bKette = "";

    public String bestOrder(ArrayList<Brick> w) {
        while (!w.isEmpty()) {

            if (w.get(0).getFrequency() > 0) {
                bChain += w.get(0).getColor() + "|";
                Brick brick = new Wimpel(w.get(0).getVariant(), w.get(0).getFrequency() - 1);
                w.remove(0);
                w.add(brick);
                // bestOrder(w);
            } else {
                w.remove(0);
            }
            bestOrder(w);
        }
        return bOrder;
    }

    public int Solutions(ArrayList<Wimpel> w) {
        ArrayList<Brick> tmp = new ArrayList<Brick>(w);
        int l = 1;

        int counter = (int) w.stream().filter(c -> Collections.max(tmp).getFrequency() == c.getFrequency()).count();
        l = (int) (fakultaet(counter) * fakultaet((tmp.size() - counter)));
        return l;
    }

    public static long fakultaet(int n) {
        return n == 0 ? 1 : n * fakultaet(n - 1);
    }
}

如何让我的代码选择最优顺序?

【问题讨论】:

  • 我添加了动态编程标签,因为我认为它与您的问题有关。
  • 我删除了 [sorting] 标签,因为问题与排序无关。
  • 实现Comparable接口然后使用Collections.sort()怎么样?
  • 绝对不是,@vatbub。将两个相等的项目与任何不相等的项目分开的项目排列都不是排序顺序。这不是排序问题。
  • 首先,您需要明确定义最佳顺序的“分数”:它是所有类型的相同类型之间最小距离的总和吗? (越高越好)

标签: java dynamic-programming


【解决方案1】:

我们不会为您进行锻炼,但我们会给您一些建议。

考虑您当前的方法:它通过循环遍历积木来填充结果字符串,只要有任何物品留在积木中,依次从每块积木中选择一个物品。但是当一块砖比任何其他砖包含至少两个项目时,这种方法肯定会失败,因为这样就只有那块砖留在最后,并且它的所有剩余项目都必须一个接一个地插入。

也就是说,问题不在于您的代码本身存在错误,而在于您的整个策略不适合该问题。你需要一些不同的东西。

现在,考虑问题本身。在正确的顺序中,哪些项目会以最短的距离出现?当然,那些频率最高的。您可以根据项目的频率和总数来计算最小距离。
假设您首先以已知的最佳距离排列这些最受限制的项目。

此时还需要做什么?好吧,您可能会拥有更多频率较低的积木,以及更多用于容纳其物品的插槽。如果您完全忽略占用的插槽,则可以将其视为之前相同问题的较小版本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-05-25
    • 2013-09-27
    • 2015-05-18
    • 2015-01-04
    • 1970-01-01
    • 1970-01-01
    • 2012-03-16
    • 2011-11-30
    相关资源
    最近更新 更多