Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C语言中的数据结构_C_Data Structures - Fatal编程技术网

C语言中的数据结构

C语言中的数据结构,c,data-structures,C,Data Structures,我必须用C语言实现一个程序,我需要一个数据结构来有效地管理一些数据。我想知道做这件事最好的方法是什么。如有任何建议或建议,我们将不胜感激。谢谢 要存储的数据类型的简化示例如下所示。假设学校教的每一门课,我们都需要记录成绩在一定范围内的学生人数。让我们假设范围大小是用户定义的,是10,因此范围将是0-9、10-19、20-29,依此类推。范围的起始值为1、10、20等等。因此,数据如下所示: Subject Id, start of range of student grades, #stude

我必须用C语言实现一个程序,我需要一个数据结构来有效地管理一些数据。我想知道做这件事最好的方法是什么。如有任何建议或建议,我们将不胜感激。谢谢

要存储的数据类型的简化示例如下所示。假设学校教的每一门课,我们都需要记录成绩在一定范围内的学生人数。让我们假设范围大小是用户定义的,是10,因此范围将是0-9、10-19、20-29,依此类推。范围的起始值为1、10、20等等。因此,数据如下所示:

Subject Id,  start of range of student grades, #students who got grades within this range. 
   1              30                                 1
                  80                                 5
                  90                                 6

   2              50                                 3                  
                  60                                 6

   3              40                                 1
                  70                                 5
请注意,所有范围都是不同的,即没有两个受试者具有相同的起始范围

注意:正如有人指出的那样,这不是家庭作业,我真的需要它来跟踪文件名、不同用户的访问计数(#访问),以及特定时间段(范围)内的访问计数。

一个矩阵(2D数组)大小如何,按范围的主题数计算。每个元素将包含特定范围内特定学科的学生人数

您需要分别在矩阵中进行范围开始到列的映射

更新:

因为你说你有100万个条目,加起来有很多内存。 考虑添加一个额外的间接层,将大矩阵分成许多更小的矩阵。 (您需要从主题到整数行索引以及从范围到列索引的映射。主题1到N以及范围1到M到Matrix1,N+1到2N,M+1到2M到Matrix2,依此类推。)

您需要进行大量测试,并确定提供最佳性能的N和M。(制作一个运行大量“常用”操作的程序,并对其进行计时。将执行时间绘制为N和M的函数,按操作类型划分。) 由于它们取决于处理器缓存和其他参数,因此不同系统上的值不太可能相同,因此它们应该在最终程序上可配置

编辑:

我的解决方案是创建一个如下所示的矩阵(基于您帖子中的数据)。您可能需要将其复制粘贴到全宽视图中

Subject\Range
    0   1   2   3   4   5   6   7   8   9
1   0   0   0   1   0   0   0   0   0   6   
2   0   0   0   0   0   3   6   0   0   0   
3   0   0   0   0   1   0   0   5   0   0   
它有很多0,因此在内存方面效率不高。它应该具有良好的性能(您可能希望选择将矩阵划分为较小的矩阵并测试这些实现的性能)

要查找给定主题的使用范围,您需要检查与该主题对应的行,任何大于0的单元格都表示其列与使用范围匹配。
要查找给定范围内的受试者,请检查相应范围的列。

如果受试者数量不太多,则这应该可以:

#define NSUBJECTS ...
#define NRANGES 10
struct data {
    int    subj_id[NRANGES];
    int    nstudents[NSUBJECTS][NRANGES];
}

用,比如说,
-1
初始化值,以指示不可用。

这闻起来像是家庭作业……不,这不是真的,尽管我可以看到示例数据被简化了,可能看起来像。我真的需要跟踪文件名(subject id->file id),不同用户的访问计数(#访问),以及特定时间段(范围)。此外,我只是在寻找提示和建议,我可以编写代码。你如何定义“高效”?快速插入?按主题ID快速查找?你想知道30-40范围内有3名学生的科目吗?存储数据的方法有很多种,选择一种取决于您以后打算用它做什么……您最好的选择可能是一个关系数据库和一些很好的访问脚本。为什么是C?快速插入会很好,尽管我真的需要按主题想法快速查找,然后是开始范围。最常见的查询有:1。给定一个主题id,所有范围内的总条目数是多少。给定一个范围,这将属于哪个主题id?(实际上,在我的真实数据中,每个主题id都有唯一的范围),3。每个主题的最大/最小范围是多少?一个主题可以有多个范围,因此二维数组不会真正工作。@lostinpointers:是的,它会。每个范围在矩阵中是一个单独的列。这假设范围对所有主题都是通用的。性能优先,内存少,因为这将是一个并行应用程序,所以使用相同的结构很好。现在我明白了,你是对的,它会起作用,尽管2d矩阵将是稀疏的,因为在一个范围数字和主题之间有一个单一的映射。主题的数量可能很大,多达数千个。