使用字符串作为数组索引标识符(无循环)

Posted

技术标签:

【中文标题】使用字符串作为数组索引标识符(无循环)【英文标题】:Using string as an array-index identifier (without loop) 【发布时间】:2018-04-14 21:14:32 【问题描述】:

假设您要从文件中读取并根据其内容创建一个包含多个对象的结构(或数组),例如:

struct  
    unsigned id; 
    char name[16]; 
    float price; 
 *items;`

然后您想使用获得的name 来引用一个对象(某些项目),因为这样用户才会知道要查找什么。

但是,使用循环实现搜索会非常慢,尤其是当您每次想要访问一个项目时都必须循环并且您需要一直访问它时。将字符串转换为整数,然后使用查找表(为性能牺牲内存)是一种解决方案,但如果名称长度超过 8 个字节怎么办。


使用名称标识符(结构中的字符串)访问从任意文件填充的已分配结构的最快方法是什么?

【问题讨论】:

看看bsearch()的例子。 这是一个广泛的问题。你可以从这里开始:en.wikipedia.org/wiki/Associative_array @IharobAlAsimi Ahh 我应该标记 mingw @SmokyPerson 平台无关,链接是标准c。例子也是ANSI c。 “什么是最快的方法” 取决于很多因素。这个问题没有通用的答案。但总的来说,如果您唯一的要求是快速查找,请使用基于哈希表的关联数组。如果您想要快速生成所有记录的排序/有序列表,那么还有更多事情需要考虑 【参考方案1】:

一种方法是使用带有字符串的散列函数的散列表。

只要表格大小合适并且散列函数在表格中均匀分布,它就可以高效地添加和查找条目。但是,如果发生冲突,则需要进行一些循环来搜索具有相同哈希值的条目。

【讨论】:

你应该注意应该处理碰撞,这不是一个简单的话题。 @IharobAlAsimi 你是对的,我是通过 cmets 关于大小和分布的暗示,但可能应该更明确。我已经扩展了我的答案。【参考方案2】:

为此使用binary search tree 是理想的。当然,更高级的结构(如 B-Trees)可能会提高性能。但是知道这一点是您真正需要的,并且二叉搜索树在很多情况下都非常有效,就像您上面描述的那样,它们仍然简单且易于实现。

一个简单的方法是使用标准库中的bsearch(),但随后插入数据集合变得困难或低效。

这些仍然是基于循环的,但它们比线性查找更有效。

【讨论】:

您如何比较使用bsearch() 与“基于哈希表的关联数组”的效率,无论这意味着什么 哈希表更高效,但更难实现。二分查找非常有效,也很容易实现。查找每个方法的“复杂度”。空间也是另一个区别,read this too。 有用。我将使用二进制搜索,因为它可以节省更多内存。现在我记得我以前使用过哈希表

以上是关于使用字符串作为数组索引标识符(无循环)的主要内容,如果未能解决你的问题,请参考以下文章

Java标识符和关键字整理

函数不会遍历数组的所有索引[重复]

UICollectionView 数组索引超出范围

php中数组可以使用哪些键名

shell脚本进阶之数组基础

SHELL脚本--shell数组基础