【问题标题】:What's The Best Data Structure For Ignoring Or Removing Some Of Elements In DataSet In Java?在 Java 中忽略或删除数据集中某些元素的最佳数据结构是什么?
【发布时间】:2021-03-16 06:41:43
【问题描述】:

我有一组对象,我想检查每个元素与以前的元素。 在每次if(thisElement % previousElement == 0) 我想忽略previousElement 以防止由于时间复杂性再次检查。 如果条件为真,我如何减小DataSet 的大小? 将previousElement 标记和移动到DataSet 的第一个或完全删除它会更好吗? 我使用了ArrayList 的对象,但我无法移动或移除它。我也使用了Iterator,但它应该有一个循环在另一个循环中,而且它很复杂。我怎样才能在最佳时间实现这个算法? 我想在 O(1) 中移动或删除 previousElement。 这是我的代码:

public static int count_max(ArrayList<Node> nodes){
        
        int max = Integer.MIN_VALUE;
        int counter = 0;
        System.err.println("nodes: "+nodes);
        for(Node n : nodes){
        
            int index = nodes.indexOf(n);
            for(int i = index - 1 ; i >= 0 && nodes.get(i).mark == 0 ; i--){
            
                counter++;
                if(n.number % nodes.get(i).number == 0){
                    
                    n.pred = i;
                    nodes.get(i).mark = 1;
                    n.count = nodes.get(i).count + 1;
                    if(n.count > max)
                        max = n.count;
                    //nodes.remove(i);

                    break;
                }
            
            }

        }
        return max;
    }

问题是找到给定的可整除数字的最大计数,例如考虑给出 [3, 4, 6, 8 ,10, 18 ,21 ,24]。答案是 3 因为 [3 , 6 , 18 ] 或 [4 , 8 , 24] 所有成员都应该是可分的 你有什么解决方案在 o(nlogn) 中找到这个或更大一点。我不想在 o (n^2)

【问题讨论】:

  • 您是否正在尝试编写一种方法,对两个连续元素执行某种检查,如果测试失败,则从数据结构中删除第一个元素对?
  • 我很困惑。您想跳过thisElement % previousElement == 0 比较吗?或者您想在这里实现的目标是什么?
  • 你能告诉我们一些你想优化的代码吗?您可以使用低效的数据结构从逻辑上展示您想要完成的工作,并指出您假定的问题所在。
  • 参见:docs.oracle.com/javase/7/docs/api/java/util/… 您可以使用Set&lt;T&gt;。如果指定的元素存在于集合中,remove 方法将返回 trueadd 方法返回 true 如果指定的元素还没有出现在集合中
  • @OLEGSHA 是的,它是一个排序列表,我想在最短的时间内找到最大的可除数集

标签: java arraylist data-structures iterator


【解决方案1】:

如果您提供了您实施的逻辑可能会更好,但根据您的解释,我的理解是,如果 Previous Element 完全划分 ,您希望删除它列表中的当前元素。如果是这样,下面提到的方法很容易遵循

MainClass.class

    public static void main(String[] args) {
    ArrayList<Integer> list = new ArrayList<Integer>();

    list.add(2);
    list.add(4);
    list.add(8);
    list.add(10);
    list.add(9);
    int i = 1;

    System.out.println("Size of List: " + list.size());
    while (i < list.size()) {
        System.out.println("i : " + i);
        System.out.println("Values : " + list.get(i) + ", " + list.get(i - 1));
        if (list.get(i) % list.get(i - 1) == 0) {
            System.out.println("Removing: " + list.get(i - 1));
            list.remove(i - 1);
            i = 1;
        } else {
            i = i + 1;
        }
    }
    System.out.println("After removing elements(if any), size is: " + list.size());
    for (int val : list) {
        System.out.print(val + " ");
    }
}

这段代码的作用是,它从 i=1 开始,并不断检查 (i-1)th 值是否除以 ith 值与否。如果 (i-1)th 是除 ith 值,那么 i 设置为“1”,因为我们需要从头开始并保持条件 即,(i-1)th 值不应除以 ith 值。你可以猜到,如果任何值不能被它的前一个元素整除,那么我们只需增加 i 直到它小于 List 的大小。

注意:我假设您希望在整个列表中保持上述条件

我希望这可以帮助您以某种方式解决您的问题。如果有人觉得需要,可以编辑这篇文章。

【讨论】:

  • 谢谢。我想检查所有以前的元素。当我尝试删除时显示错误为并发异常。我该如何解决这个问题?
  • @a.programmer,您能否举一个示例列表,您想在其中检查所有以前的元素。
  • @B Sangappa 问题是找到给定的可除数的最大计数,例如考虑给出 [3, 4, 6, 8 ,10, 18 ,21 ,24]。答案是 3 因为 [3 , 6 , 18 ] 或 [4 , 8 , 24] 所有成员都应该是可分的 你有什么解决方案在 o(nlogn) 中找到这个或更大一点。我不想在 o (n^2)
  • @a.programmer,我可以看到 21 和 24 也可以被 3 整除,在这种情况下,答案应该是 5 对吧?还是我错过了什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-02-07
  • 1970-01-01
  • 1970-01-01
  • 2011-02-28
  • 1970-01-01
  • 2020-09-18
  • 2017-12-09
相关资源
最近更新 更多