清除一个定义元素的数组 - 页 21

 
不知道它的表现如何?
ArraySetAsSeries(array,true);
在最后一个变体中,我也为它做了一个检查。谁需要它,谁就可以使用它。
附加的文件:
 
Реter Konow:

对。但我们怎么知道所提供的算法没有留下任何空白?校验和并不能证明这一点。元素的数量也是如此。毕竟,这个函数计算的是在数组被调整大小之前的元素。

在几乎所有的情况下,通过发送一个带有NULL的查询,可以顺利实现。

标签科诺

对该算法还有一个要求--在去除不必要的项目后,在数组内正确放置项目。必须先进行这项检查。然后是对速度的检查。

代码中解释了哪些返回什么。有洗牌的数组。有在另一个阵列中。

P.S. 而且只是为了记录。我的函数有一些检查,但没有使用。但它已经拥有这一切,甚至更多。

 

我不是在质疑参与者的专业性和他们的位置。我只是指出了校验和检查中的一个缺陷,还有,需要对新数组中元素排列的正确性进行额外的验证。

如果这些都是正确的,我当之无愧地得到了倒数第二名。

在我的实践中,我很少考虑具体操作的速度问题。我更关心的是解决方案的简洁性和清晰度。让我感到惊讶的是,这个条目

if(Arr[q]==val){deleted++; q--;}

可能会很慢。

但如果你再加上一个算法评估的标准--解决方案的紧凑性--我可能就会排在第一位了。

如果你把两个标准--速度和压缩结合起来,并计算平均算法得分,那么我在表中占据了更高的位置。

不过,费多谢耶夫的版本比我的更加凝练。
 
Реter Konow:

然而,如果你加上另一个评估算法的标准,即解决方案压缩,我可能会排在第一位。

你的主循环的版本。

for(int a1=0; a1<ArraySize(Arr); a1++)
     {
      if(deleted)Arr[q]=Arr[q+deleted];
      if(Arr[q]==val)
        {
         deleted++; 
         q--;
        }
      q++;
     }

而这是费多谢耶夫的。

for(;i<sz;i++)
     {
      if(a[i]!=v)
        {
         a[j]=a[i];
         j++;
        }
     }

两种变体都做同样的事情。谁最简明扼要?

 
Nikolai Semko:

你的主循环的版本。

而这是费多谢耶夫的。

两者都做同样的事情。谁最简明?

他。他得到了它,而不是...

for(int a1=0; a1<ArraySize(Arr); a1++)
for(;i<sz;i++)

它更简洁)。

 
Реter Konow:

他有。他得到了它,而不是...

这样更简洁。))

这对编译器来说也是一样的。

你只是有很多不必要的东西,所以它的工作速度比其他人慢(我甚至没有考虑题目中的第一个选项)。

Fedoseyev的代码在一个循环通道中有一个 检查、一个 赋值和一个 增量(我没有计算循环组织的检查和增量)。

相比之下,你有两个 检查,一个两个变量之和三个 增量和一个 赋值。

 
for(int a1=0; a1<ArraySize(Arr); a1++)

所有的希望都寄托在编译器的优化上,否则ArraySize 会在每次迭代中被执行。

 
Aleksey Lebedev:

所有的希望都寄托在编译器的优化上,否则ArraySize会在每次迭代时被执行。

是的,编译器似乎在检查,如果数组的大小 在循环中没有变化,它就会独立地用一个值替换这个函数,并且只计算这个函数一次。
无论如何,如果你这样做。

const int size=ArraySize(Arr);
for(int a1=0; a1<size; a1++)

函数的执行时间将不会改变。

因此,为了更加紧凑,完全按照彼得的方式来写是有意义的 :)
但我同意,就我个人而言,它也刺痛了我的眼睛。感觉每次都会调用这个函数。

 
Nikolai Semko:

但我同意,就我个人而言,它也切断了我。感觉每次都会调用这个函数。

我认为最好不要让编译器做出选择)

让我问你一个问题。

如果(count>6) {ArrayCopy

 
Aleksey Lebedev:

我认为最好不要让编译器有选择权)

让我问你一个问题。

如果(count>6) { ArrayCopy

超过6个--这个数值是通过科学的直觉获得的,或者说背后的理由是什么?)

是的,这正是它。科学直觉的方法。根据我的观察,实际上是从5到8。你可以通过每次自动调整这个数字来实现这个过程的自动化。毕竟,这个数字对于不同的处理器和系统可能是不同的。

例如,如果你按照这个原则改变CCanvas类中 的所有ArrayCopy和ArrayFill,你可以在canvas的速度上得到很好的提升。