0

为了解决这里的问题#3367795,我必须处理一些子问题。其中之一是:在所述算法(levenshtein distance)中,在内存中分配了几个数组并用行初始化

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这里指的是 Pythonbytes变量的长度。现在据我了解算法(完整代码请参阅我的原始帖子)以及初始化代码m2清楚地表明,这些数组旨在保存整数,而不是字符,因此人们会认为正确的分配应该看起来像

cdef int    *m3     = <int *>malloc( ( blen + 2 ) * sizeof( int ) )

等等。任何有 C 背景的人都可以向我解释为什么char要使用吗?另外,对于倾向于 Cython 的人来说可能更多,为什么会有演员表<char *>?有人会认为这char *x = malloc( ... )足以定义x.

4

2 回答 2

8

尽管名称具有误导性,但charC 语言中的类型是普通的整数类型,就像short,int等一样long。在所有整数类型中,chars 的范围最小,占用的内存最少。因此,如果在您的应用程序中尽可能多地节省内存很重要,那么char使用int.

在某些硬件平台上,类型可能int比类型工作得更快char,因此特定类型的选择成为速度与内存之间的权衡,但是,在许多情况下,当范围char自然足够时,它使用char而不是int.

于 2010-07-31T21:14:51.123 回答
2

很简单,为了节省内存——但请注意,将这些数组声明为char将结果距离限制为 127 或 255,具体取决于 C 编译器是否默认为signed charunsigned char分别。在 C 中,char是一个整数类型——你不需要 anord()来获取它的整数值。

您的原始代码未提及此限制。请注意,如果 achar溢出,它会静默执行,代码将产生不正确的结果-- 127 + 1 -> -128 (signed);255 + 1 -> 0(无符号)。

你没有回应我对你原来的问题的评论:“”“你的字符串的 (a) 最大 (b) 平均大小是多少?你真的需要做整个 O(M*N) 的事情,如果这两个字符串彼此完全不同?""" .....现在请回答(编辑您的问题);如果你当时这样做了,那么你就会得到这个问题的回答。

更新:再次阅读原帖,我注意到一个问题:读取的代码

m1, m2 = m2, m1
strcpy( m3, m2 )

在三个方面是错误的:(1)它没有正确地打乱行(应该strcpy()在交换之前m1m2)(2)strcpy()不会复制第一个空(零字节)之外的任何东西(3)不需要复制任何东西,只是洗牌的指针

m3, m2, m1 = m2, m1, m3
于 2010-07-31T21:28:01.830 回答