我有n(8位)字符串,所有字符串都具有相同的长度(比方说m),另一个字符串s长度相同.我需要计算汉明距离s到其他每个字符串的距离.在普通的C中,类似于:
unsigned char strings[n][m];
unsigned char s[m];
int distances[n];
for(i=0; i<n; i++) {
int distances[i] = 0;
for(j=0; j<m; j++) {
if(strings[i][j] != s[j])
distances[i]++;
}
}
Run Code Online (Sandbox Code Playgroud)
我想使用带有gcc的SIMD指令来更有效地执行这样的计算.我已经读过PcmpIstrI在SSE 4.2中有用并且我的目标计算机支持该指令集,所以我更喜欢使用SSE 4.2的解决方案.
编辑:
我编写了以下函数来计算两个字符串之间的汉明距离:
static inline int popcnt128(__m128i n) {
const __m128i n_hi = _mm_unpackhi_epi64(n, n);
return _mm_popcnt_u64(_mm_cvtsi128_si64(n)) + _mm_popcnt_u64(_mm_cvtsi128_si64(n_hi));
}
int HammingDist(const unsigned char *p1, unsigned const char *p2, const int len) {
#define MODE (_SIDD_UBYTE_OPS | _SIDD_CMP_EQUAL_EACH | _SIDD_BIT_MASK | …Run Code Online (Sandbox Code Playgroud) 让我们考虑以下定义,以将 Int 的嵌套 Iterable 结构中的所有元素相加:
def add(xss : Iterable[Iterable[Int]]) : Int = xss.map(_.sum).sum
Run Code Online (Sandbox Code Playgroud)
但是,计算以下表达式会产生类型错误:
scala> add(Array(Array(1,2,3)))
<console>:9: error: type mismatch;
found : Array[Array[Int]]
required: Iterable[Iterable[Int]]
add(Array(Array(1,2,3)))
^
Run Code Online (Sandbox Code Playgroud)
该函数与其他可迭代对象(如列表)一起按预期工作。我怎样才能避免这个错误?这样做的理由是什么?猜测这与 Java 原生的数组有关,但不知道这种情况下的具体细节。
谢谢