Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/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
C# 有没有办法让循环代码更快?_C# - Fatal编程技术网

C# 有没有办法让循环代码更快?

C# 有没有办法让循环代码更快?,c#,C#,int计数=0; 列表计数=新列表(); List goodnumber=新列表(); for(int i=较低;i 调用List.Clear(),而不是在循环中创建新的列表 在循环外部调用count.Max() 删除最后一个if,并在循环count.add(goodnumber.count) int计数=0; 列表计数=新列表(); List goodnumber=新列表(); 对于(inti=lower;i,您可以做一些改进 badNumbers可能应该是一个HashSet,它将为您提供

int计数=0;
列表计数=新列表();
List goodnumber=新列表();
for(int i=较低;i
  • 调用
    List.Clear()
    ,而不是在循环中创建新的列表

  • 在循环外部调用count.Max()
  • 删除最后一个if,并在循环
    count.add(goodnumber.count)

    int计数=0;
    列表计数=新列表();
    List goodnumber=新列表();
    
    对于(inti=lower;i,您可以做一些改进

  • badNumbers
    可能应该是一个
    HashSet
    ,它将为您提供接近O(1)的查找
  • 实际上,您并不关心存储“好数字”(您不使用该数据),因此只存储遇到的好数字的数量会更有效
  • 现在,您只需要获得遇到的最大条纹大小(即连续良好数字的最大数量),您可以使用
    Math.max
    将上一次“良好”计数与当前“良好”计数进行比较,并选择最大值
  • 代码如下所示:

    HashSet<int> badNumbers = new HashSet<int>() { 5, 4, 2, 15 };
    int counts = 0;
    int goodNumberCount = 0;
    for (int i = lower; i <= upper; i++)
    {
        if (!badNumbers.Contains(i)) {
            ++goodNumberCount;
        } else {
            counts = Math.Max(counts, goodNumberCount);
            goodNumberCount = 0;
        }
    }
    counts = Math.Max(counts, goodNumberCount); 
    return counts;
    
    HashSet badNumbers=newhashset(){5,4,2,15};
    整数计数=0;
    int goodNumberCount=0;
    对于(int i=lower;i而言,“优化”代码的正确方法是重写代码。您需要以不同的方式思考。您遇到的问题有各种不同的解决方案,并且您将其复杂化了太多

    您不需要只在一个长周期内处理输入。您可以以某种方式对列表进行预处理,这会对您有所帮助。例如,排序

    另一件可以帮助您的事情是有一个变量(或多个变量),您在其中存储一些中间结果。例如,运行max、min、sum或某物的上一个值

    想想你如何用数学方法来解决这个问题。这不只是你试图找到的数字的差异吗


    您可以对列表进行排序,计算每个元素之间的差异,用上下边框将其绑定。您可以在循环期间更新正在运行的最大差异,也可以从差异列表中找到最大差异。

    以下是一个通用解决方案:

    使用System.Collections.Generic;
    使用System.Linq;
    名称空间控制台EAPP1
    {
    班级计划
    {
    静态void Main(字符串[]参数)
    {
    var下限=1;
    var上限=10;
    var elementCount=上限-下限+1;
    变量编号=可枚举范围(1,elementCount);
    var badNumbers=新哈希集{5,4,2,15};
    var maxCount=CalculateCounts(数字、坏数字).Max();
    }
    私有静态IEnumerable CalculateCounts(IEnumerable项,ISet splitOn)
    {
    var计数=0;
    foreach(项目中的var项目)
    {
    如果(!splitOn.Contains(item))计数++;
    其他的
    {
    收益回报计数;
    计数=0;
    }
    }
    收益回报计数;
    }
    }
    }
    
    你能在这篇文章中加入代码而不是链接吗?好吧,我想你不知道你在做什么……你应该把代码读几遍,然后用纸和笔画出算法。下面是你的评论:“仍然超出了时间限制,先生”,我猜这是一个在线编程测试或什么的,他们希望你降低你的渐进复杂性。你有没有描述你正在尝试做什么(你的代码很难理解)?问题是你正在调用
    badNumbers。Contains(I)
    在一个循环中。我很确定
    .Contains
    是O(N),所以你得到了O(N^2)行为。他们(不管他们是谁)希望你减少这个值。你的上限和下限值是多少?这段代码是为什么编写的?OP可以很容易地找到一份混淆师的工作。他试图从“下限”和“上限”绑定的“坏数字”中找出数字之间最长的序列。仍然超过了时间限制,先生。你是在计时发布版本吗?从他的另一个问题来看,错误的数字是
    {5,4,2,15}
    。你错过了一个
    ;)(现在更新)@Andrew你说得对,我说得对:D谢谢!谢谢你给OP提供的数字。@John,你好,先生。如果
    上限值为100000000,有没有办法将运行时间限制在3秒?@LevesqueXylia在更快的机器上运行它。你如何确定需要多长时间?@John,有两个测试用例没有输出beca使用时间限制仅为3秒。谢谢您,先生!!
    
        int counts = 0;
        List<int> count = new List<int>();
        List<int> goodnumber = new List<int>();
        for (int i = lower; i <= upper; i++)
        {
            if (!badNumbers.Contains(i)) {
                    goodnumber.Add(i);
            } else {
                count.Add(goodnumber.Count);
                goodnumber.Clear();
            } 
    
        }
    
        count.Add(goodnumber.Count);
        counts = count.Max();
        return counts;
    
    HashSet<int> badNumbers = new HashSet<int>() { 5, 4, 2, 15 };
    int counts = 0;
    int goodNumberCount = 0;
    for (int i = lower; i <= upper; i++)
    {
        if (!badNumbers.Contains(i)) {
            ++goodNumberCount;
        } else {
            counts = Math.Max(counts, goodNumberCount);
            goodNumberCount = 0;
        }
    }
    counts = Math.Max(counts, goodNumberCount); 
    return counts;