使用字符串作为数组索引标识符(无循环)
Using string as an array-index identifier (without loop)
假设您想从文件中读取数据并根据其内容创建一个包含多个对象的结构(或数组),例如:
struct {
unsigned id;
char name[16];
float price;
} *items;`
然后您想使用获得的 name
来引用一个对象(某些项目),因为这就是用户知道要查找什么的方式。
但是,实现使用循环的搜索会非常慢,尤其是当您每次想要访问某个项目时都必须循环并且您需要一直访问它时。将字符串转换为整数然后使用查找 table(为了性能牺牲内存)是一种解决方案,但是如果名称超过 8 个字节怎么办。
使用名称标识符(结构中的字符串)访问从任意文件填充的已分配结构的最快方法是什么?
为此使用 binary search tree 是理想的。当然,更高级的结构(如 B 树)可能会提高性能。但是了解这一点是您真正需要的全部,二叉搜索树在许多情况下都非常有效,就像您上面描述的那样,它们仍然简单且易于实现。
一个简单的方法是使用标准库中的bsearch()
,但是插入数据集合变得困难或效率低下。
这些仍然是基于循环,但它们比线性查找更有效。
一种方法是使用哈希函数 table 来获取字符串。
只要 table 的大小合适并且散列函数在 table 中均匀分布,添加和查找条目将保持高效。但是,如果发生冲突,则需要一些循环来搜索具有相同哈希值的条目。
假设您想从文件中读取数据并根据其内容创建一个包含多个对象的结构(或数组),例如:
struct {
unsigned id;
char name[16];
float price;
} *items;`
然后您想使用获得的 name
来引用一个对象(某些项目),因为这就是用户知道要查找什么的方式。
但是,实现使用循环的搜索会非常慢,尤其是当您每次想要访问某个项目时都必须循环并且您需要一直访问它时。将字符串转换为整数然后使用查找 table(为了性能牺牲内存)是一种解决方案,但是如果名称超过 8 个字节怎么办。
使用名称标识符(结构中的字符串)访问从任意文件填充的已分配结构的最快方法是什么?
为此使用 binary search tree 是理想的。当然,更高级的结构(如 B 树)可能会提高性能。但是了解这一点是您真正需要的全部,二叉搜索树在许多情况下都非常有效,就像您上面描述的那样,它们仍然简单且易于实现。
一个简单的方法是使用标准库中的bsearch()
,但是插入数据集合变得困难或效率低下。
这些仍然是基于循环,但它们比线性查找更有效。
一种方法是使用哈希函数 table 来获取字符串。
只要 table 的大小合适并且散列函数在 table 中均匀分布,添加和查找条目将保持高效。但是,如果发生冲突,则需要一些循环来搜索具有相同哈希值的条目。