0

我想实现一个哈希或类似 PHP 的数组。哪个更好,选项 a) 或选项 b) 通过键查找元素?

(所有变量都被设置和初始化等等!)

一种)

for( i = 0; i < ary->element_cnt && found == NULL; i++ ) {
    current_element = &(ary->elements[i]);
    if( 0 == memcmp(current_element->key, search_key, keysize) ) {
        found = current_element;
    }
}

b)

for( i = 0, current_element = &(ary->elements[i]) ; 
        i < ary->element_cnt &&  
        0 != memcmp(current_element->key, searchkey, keysize); 
        i++, current_element = &(ary->elements[i]) );
/*found = current_element;*/

第一个更好,因为它更具可读性/可维护性?第二个会更快吗?

在一个大循环中做所有事情是“坏风格”吗?

我知道,那里有更好的搜索算法,但这不是我的问题!

4

2 回答 2

5

这两种都是 O(N) 算法——它们都只是简单地遍历一个数组并调用memcmp每个元素——所以它们应该执行类似的操作。主观上,我认为第一个更好,因为它更容易阅读。

然而,实现按键查找的最佳方式不是使用像这样的线性搜索,而是使用专门的数据结构,如哈希表或平衡二叉树。像 PHP 这样的脚本语言通常使用哈希表来实现这样的查找。

于 2012-12-11T16:15:34.437 回答
3

当然,所有风格问题都是高度主观的。这是有时由本地代码样式指南“规范”的事物类型。

就我个人而言,我认为调用memcmp()有点过于“沉重”,我会写成:

for( i = 0; i < ary->element_cnt; ++i ) {
    current_element = &ary->elements[i];
    if( memcmp(current_element->key, search_key, keysize) == 0 )
        break;
}

这消除了found循环头中的检查,因为这实际上是对我不喜欢的同一件事进行了两次检查。

如果我真的想使用found,我会写成:

for( i = 0; i < ary->element_cnt && !found; ++i ) {
    current_element = &ary->elements[i];
    found = memcmp(current_element->key, search_key, keysize) == 0;
}

这消除了无意义的if,只是直接分配布尔值,我认为这很好。

于 2012-12-11T16:16:33.170 回答