【问题标题】:Looping through array, what is better, faster, etc?遍历数组,什么更好,更快等?
【发布时间】:2012-11-29 05:20:30
【问题描述】:

我想实现一个哈希或类似 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;*/

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

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

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

【问题讨论】:

  • 第二个真的会更快吗?检查生成的代码并先进行一些分析,然后再牺牲可读性以进行一些感知优化。
  • 已编辑问题。我不知道!我的措辞不如应有的好。
  • 这主要是品味问题。在性能方面,大部分时间将花在进入/退出memcmp,所以如果这占总时间的很大一部分,我会尝试以不同的方式来做。我经常做for (i = n; --i&gt;=0;) if (test(i)) break; 所以i 是找到的元素,除非它是负数。
  • first 更好,因为它更容易阅读
  • 作为一个挑剔的嵌入式小伙子,更快的是:i = ary->element_cnt;而(i--) ...

标签: c arrays algorithm search coding-style


【解决方案1】:

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

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

【讨论】:

  • 我不喜欢“两个 O(N) 算法的性能大致相同”的推理。恕我直言,使用“相似”甚至更好的“渐近相似”会更好
  • 这取决于论证的水平。从算法和技术的角度来看,Charles 是绝对正确的。它们甚至没有渐近相似的表现。
【解决方案2】:

所有的风格问题当然都是高度主观的。这是当地代码风格指南有时会“规范”的类型。

我个人认为对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,直接分配布尔值,我认为这很好。

【讨论】:

    猜你喜欢
    • 2017-03-04
    • 2013-02-12
    • 1970-01-01
    • 1970-01-01
    • 2019-04-30
    • 2021-01-08
    • 2016-10-08
    • 1970-01-01
    • 2021-05-27
    相关资源
    最近更新 更多