我有一个小问题,在 LARGE unsigned char 数组和仅包含 unsigned char 元素的向量中扫描某些元素的最快方法是什么?直接的答案会很棒,但深入详细的答案会很棒。我说的快是什么意思?基本上,至少在一秒钟内搜索某些字符。我知道这不是一个受过良好教育的定义...
注意:数组未排序。
共同声明:
unsigned char* Array = new unsigned char[ 50000 ];
std::vector< unsigned char > Vec( 50000 );
/*
* Fill Array & Vec with random bytes
*/
可以说,我想在数组中搜索字母“a”,我只需编写这个循环来搜索它:
注意:搜索过程将搜索多个元素。主要是 256。因此,您可以利用这个神奇的数字。
For循环方法:
unsigned int Count = 0;
for ( unsigned int Index = 0; Index != 50000; ++ Index )
if( Array[ Index ] == 'a' ) Count ++;
std::count 方法:
unsigned int Count = std::count ( Array, Array + 50000, 'a' );
有没有更快的方法来搜索 Array 中的某些元素?
一些想法 - 请不要为此给我一个大拇指!它只是一个想法。我想要一些意见。
排序
如果我们复制 Array 并对其进行排序,速度会更好吗?为什么要复制?好吧,因为我们需要保留原始内容。目标是基本上扫描并计算一个字符的出现次数。记住,速度很重要。这意味着,复制过程必须很快。
Answer: No and its not worth it!
为什么?好吧,让我们读一下:
@基里尔基洛夫:
依靠。如果您打算搜索单个字符 - 绝对不会。复制数组是一项昂贵的操作。对其进行排序 - 甚至更昂贵。
好吧,如果您只有一个数组并且您计划搜索 100 个不同的字符,那么这种方法可以为您提供更好的性能。现在,这实际上取决于您的使用情况。对于这种情况,没有人能给你绝对正确的答案。您需要运行它并配置文件。
*向下滚动到@Kiril Krov 的信息帖子以获取更多信息。
答案: 到目前为止,还没有一个可靠的或答案,因为没有一个真正“快速”的方法来实现这个目标,尤其是当它没有排序的时候。但是,线程可能是一种可能的解决方案。但是,请注意我们的 CPU!这是基于@Andrea 提交的答案(向下滚动以获取更多信息) - 我希望我没看错。