如何快速检查一个数组(最好是整数数组)中的所有元素是否相等。到目前为止,我一直在使用以下代码:
bool check(int array[], int n)
{
bool flag = 0;
for(int i = 0; i < n - 1; i++)
{
if(array[i] != array[i + 1])
flag = 1;
}
return flag;
}
int check(const int a[], int n)
{
while(--n>0 && a[n]==a[0]);
return n!=0;
}
bool
类型的做法,你只是将返回类型改为int
,以确保安全?;) - Christian Raua[0]
作为常量。您开始比较位于数组两端的a[0]
和a[length-1]
,这需要进行两次RAM往返(对于长度超过64个字节的数组),才能开始比较。 - Matthieu M.这里有一个可行的C++11解决方案。优点在于你不需要手动操作索引或迭代器。最佳实践是:
更倾向于使用算法函数而非手写循环 [Herb Sutter - C++编程规范]
我认为这个方案和Paul R的解决方案一样有效。
bool check(const int a[], int n)
{
return !std::all_of(a, a+n, [a](int x){ return x==a[0]; });
}
n
为零时)。 - JFMR一旦您找到了一个不匹配的元素,就可以跳出循环:
bool check(const int array[], int n)
{
for (int i = 0; i < n - 1; i++)
{
if (array[i] != array[i + 1])
return true;
}
return false;
}
如果这很重要,则可以稍微进一步优化,例如:bool check(const int array[], int n)
{
const int a0 = array[0];
for (int i = 1; i < n; i++)
{
if (array[i] != a0)
return true;
}
return false;
}
memcmp
(已经进行汇编优化),具体如下:1)将数组分成两个大小相等的部分。2)比较它们3)如果不同,则返回false。否则,取第一半,忽略第二半4)将第一半分成两半5)...这样只需要进行N次比较。 - Ciro Santilli OurBigBook.com为了提高程序员的效率,您可以尝试以下一行代码。
vector<int> v{1, 1, 1, 1};
all_of(v.cbegin(), v.cend(), [&r=v[0]](int value){ return value == r; }->bool);
我没有运行测试这段代码,如果有语法错误请告诉我。
我认为以下代码比最高评分的答案更易读,而且我敢打赌它也更有效率(但我还没有进行基准测试)
bool check(int a[], int n)
{
if (n)
{
auto first = a[0];
for(int i = 1; i < n; i++)
{
if(array[i] != first) return false;
}
return true;
}
return true; //change to false for the OPs logic. I prefer logical true here
}
理论上,我会提出这个:
bool check_single(const int a[], int n)
{
for (int i = 1; i < n; ++i) {
if (a[0] != a[n]) { return false; }
}
return true;
}
a [0]
将被编译器提升到循环外部,意味着循环内只有单个数组访问a [0]
然后从a [n]
循环更好(访问方面)显然,它仍然检查N个元素,因此是O(N)。
bool check(int array[],int n)
{
// here 1st element is checked with others. This decreases the number of iteration by 1.
// also it returns immediately.
// The requirement is to check if all the elements are equal.
// So if 1st element is equal to others then all elements are equal.
// Otherwise the elements are not equal.
for(int i=1;i<n;i++)
{
if(array[0]!=array[i])
return false;
}
return true;
}
for(int i=1;i<n;i++)
,而else
会导致中断。return 1
应该出现在循环外部,并且1/0需要反转,当不相等时应该返回1,如果全部相等则返回0。 - Gary.Sarray[i-1]
应该已经在缓存中了(如果编译器还没有进行一些优化的话)。 - Christian Rau基本上这是一个O(n)操作,所以除了放弃标志并在第一次失败时return false;
,在迭代后return true;
,你不能做得更好。
寻找适用于您平台的支持线程或并行for循环的库,并将计算拆分,以便不同核心测试数组的不同范围。
这里列出了一些可用的库:
或许,你可以利用许多GPU提供的并行性。
false
,在循环下方返回true
,这样就不需要使用flag
了。否则我认为这已经是最有效率的写法了。 - Ivaylo Strandjevbool
)? - Christian Rau0
和1
赋值给long
,依赖于隐式转换! - Steve Jessopmemcmp
来比较两个int
吗?我不这么认为。只是为了确认,你不是那些认为他想要比较两个范围的人之一吧? - Christian Rau