在 C/C++ 中列出项目的最有效方法
Posted
技术标签:
【中文标题】在 C/C++ 中列出项目的最有效方法【英文标题】:Most efficient way to list items in C/C++ 【发布时间】:2008-11-09 14:22:47 【问题描述】:我有一个包含 100 个未排序项目的列表。每个项目都属于一个组。项目所属的组只是项目类的成员。
使用 C/C++ 我正在寻找最有效的方式来扫描项目列表、检查它们在哪个组中并将项目打印到屏幕上。不过,这就是问题所在。一旦某个组中的一个项目被打印到屏幕上,我就不想再打印属于该组的任何项目了。
我使用的是预 STL 编译器,可执行文件的大小很关键,所以我不想开始定义自己的 Hash 类。
【问题讨论】:
您需要提供更多信息。您的物品清单是否已排序?什么构成了项目和组之间的联系?这只是一个命名组的 std::string 成员吗? 【参考方案1】:根据组值对项目进行排序(如果是指针,则可以使用其地址,否则字典序对字符串进行排序) .然后遍历该排序列表,始终获取每个组的第一项。
这大约需要
n + n * log(n)
我认为这是可执行文件大小和速度之间的合理选择。
【讨论】:
由于n只有100左右,这种折衷是完全合理的;没有理由为这么小的问题使用复杂的数据结构。【参考方案2】:您可以创建组的字典/哈希图,并为每个组存储一个布尔值,说明该组的项目是否已打印。
示例代码:
#include <unordered_map>
#include <string>
#include <iostream>
std::string getGroupForNumber( int num )
//
int main()
typedef std::tr1::unordered_map< std::string, bool > hashmap;
hashmap groupsPrinted;
for( int i = 0 ; i < 100 ; ++i )
if ( groupsPrinted[ getGroupForNumber( i ) ] == false )
groupsPrinted[ getGroupForNumber( i ) ] = true;
std::cout << i << std::endl;
return 0;
【讨论】:
谢谢,我想到了,但问题是我使用的是预 STL 编译器,这意味着我需要创建自己的哈希类。出于空间限制的原因,这是我想避免的。【参考方案3】:您确实在问题中编写了 c/c++,所以这里有一些 c 代码。 有几个问题是有序的。 未来某个时间组是否可以打印? 项目列表是静态的吗? 您打印特定组中的哪个项目是否重要?
我会建议以下构造(我对问题的理解有限):
列表数组。
typedef struct node
void *item; /* this is your item */
node *next;
node_t;
typedef struct
node_t *my_group;
int used;
group_t;
static group_t my_items[NUM_OF_GROUPS]; /* this is your ordered by groups list.*/
更好的是,使用列表列表。 group_t 将是:
typedef struct group
node_t *my_group;
group *next_free;
group_t;
【讨论】:
【参考方案4】:保留一个 std::set 组名,其中项目不应再打印。
【讨论】:
【参考方案5】:如果您可以将组编号为 0..99,那么您将需要一个布尔数组,如果您想优化,则需要一个位集。 将所有数组初始化为“假”。 打印后设置 arr[groupId] = 'true',下次打印前检查值。不需要 STL。
【讨论】:
【参考方案6】:回答更多问题。
项目列表是静态的吗?
不,它可以随时缩小或增长。
从 您打印的特定组?
暂时没有,没有。也许在未来,但目前打印属于唯一组的第一个项目就足够了。
【讨论】:
【参考方案7】:组呢?你能得到一个新的组吗?在您打印其中一个成员后,该组是否可以变得相关?
【讨论】:
【参考方案8】:打印到屏幕的成本比您可以对对象执行的任何其他操作高出几个数量级。如果您在几个组中有一个包含 1000 万个对象的数组,那么排序不是一个合理的选择。如果可以通过静态索引(即给定范围内的整数)识别组,只需使用掩码数组来指示是否已看到它。如果组比较复杂,可以将已经看到的组存储在任何集合数据结构(散列、树等)中。
【讨论】:
以上是关于在 C/C++ 中列出项目的最有效方法的主要内容,如果未能解决你的问题,请参考以下文章
Java 中将位打包到 byte[] 并读回的最有效方法是啥?