为了解决问题#3367795,我必须应对一些子问题。其中之一是:在所述算法(levenshtein距离)中,在内存中分配了几个数组并用行初始化
cdef char *m1 = <char *>calloc( blen + 2, sizeof( char ) )
cdef char *m2 = <char *>calloc( blen + 2, sizeof( char ) )
cdef char *m3 = <char *>malloc( ( blen + 2 ) * sizeof( char ) )
#.........................................................................
for i from 0 <= i <= blen:
m2[ i ] = i
<...snip...>
blen
这里指的是Python bytes
变量的长度。现在据我所知的算法(参见我的原始帖子中的完整代码)和m2
的初始化代码清楚地显示,这些数组意味着保存整数,而不是字符,所以人们会认为正确的分配应该看起来像
cdef int *m3 = <int *>malloc( ( blen + 2 ) * sizeof( int ) )
等等。任何有C语言背景的人都可以向我解释为什么使用char
?对于倾向于Cython的人来说,也许更多,为什么有一个演员<char *>
?人们会认为char *x = malloc( ... )
应该足以定义x
。
答案 0 :(得分:8)
尽管名称误导,但C语言中的char
类型是普通的整数类型,就像short
,int
,long
等。在所有整数类型中,char
具有最小范围并占据最小的内存量。因此,如果在您的应用程序中保存尽可能多的内存非常重要,那么使用char
代替int
可能是有意义的。
在某些硬件平台上,int
类型的工作速度可能比char
类型更快,因此特定类型的选择会成为速度与内存之间的权衡,但是,再一次,在很多情况下,当char
的范围自然足够时,使用char
而不是int
更有意义。
答案 1 :(得分:2)
非常简单,为了节省内存 - 但请注意,将这些数组声明为char
会将结果距离限制为127或255,具体取决于C编译器默认为signed char
或{分别为{1}}。在C中,unsigned char
是整数类型 - 您不需要char
来获取其整数值。
您的原始代码未提及此限制。 请注意,如果ord()
溢出,则会默默地执行,代码会产生错误的结果 - 127 + 1 - &gt; -128(签名); 255 + 1 - &gt; 0(无符号)。
你没有回复我对你原来问题的评论:“”“(a)你的琴弦的最大(b)平均大小是多少?你真的需要做整个O(M * N)的事吗?如果这两个字符串彼此不一样吗?“”“.....请现在回答(编辑你的问题);如果你这样做了,那么你会回答这个问题。
更新:再次阅读原帖,我发现了一个问题:代码为
char
错误有三个原因:(1)它没有正确地对行进行洗牌(在交换m1, m2 = m2, m1
strcpy( m3, m2 )
和strcpy()
之前应该m1
)(2)m2
不会复制超出第一个空(零字节)的任何东西(3)没有必要复制任何东西,只需改变指针
strcpy()