数据结构(C):大砖小房子,还是小砖大房子?
Data structures (C): big bricks small house, or small bricks big house?
假设我有一个 C 库,用于从 brick
中构建 house
。与每个 brick
相关联的是一组 double
s 和 int
s,对应于它的尺寸、重量、颜色以及它来自哪批货物等。house
是然后只是某种形式的有组织的积木收集。我的房屋建筑库中的一些功能接收 house
,但大多数接收并运行 bricks
; house
主要使用本地 brick
-wise 操作构建,对应于 adding/removing 一块砖头等本地更改。
在我(软弱、缺乏经验)看来,有两种“自然”的方式来表示这种 house
-made-of-brick
s 的数据结构设置。
做法一:大透明砖,小房子。让每个 brick
结构包含每个关联的 double
s 和 int
s 的字段,以及指向紧邻它的砖块的指针。在此设置中,与 house
相比,每个 brick
都是一个大结构(house
可以想象只是指向任何 brick
的指针),整个事情是只是一大堆指针。
方法二:小不透明砖,大房子。让每个 brick
只包含一个整数 index
和一个指向其所属 house
的指针; house
然后包含 double
s 和 int
s 的数组,brick
s 可以切入这些数组以获取它们的数据,再加上一些额外的 arrays/tables所有连接信息。通过这种方法,无论我们在代码中的什么位置,都可以使用大型 house
结构来保存和管理资源,每个 brick
都可以看到该结构。
问题:在什么情况下(如果有)方法 1 优于方法 2?
我非常喜欢方法 2,但很难准确说明是什么使它在客观上 比方法 1 更好。在此先感谢您的任何建议 and/or 指向适当阅读的指针 material。关于如何更好地表达我的问题的建议也非常受欢迎:)
正如其他人所指出的,您正在描述一个图问题,并询问用哪种方法来表示这个图。但是,您的问题没有指定您要实现的应用程序。以下是我想到的几种情况:
1) 应用程序更关心房子而不是每一块砖:例如,你想计算房子的某些指标,大部分砖来自哪里,房子的最终尺寸是多少,那么第二种方法将更能代表您要解决的问题。因此更容易实施和维护。
2) 将积木视为独立实体至关重要。该应用程序更关心删除、移动或更一般地在砖块级别而不是房屋级别上进行操作。那么第一种方式更合适
您提出了两个极端,但可能也有介于两者之间的方法。例如,您可以将邻接信息存储在房屋中,但将有关颜色、重量、大小和来源的信息保存在砖块中。您还可以将源信息从 house 和 brick 结构中移出,并将其放入单独的结构中,例如表示源并包含指向砖的指针列表的结构。
你不能说 objective 哪种方法更好,直到你说出你想要优化的目标。阿德米已经提到了两个可能的目标,但可能还有更多。
然后问题也是您要优化的参数:它是性能吗?代码大小?运行时内存使用情况?代码清晰度?
一旦您定义了您的目标,并且您有两个或更多的替代实现可供选择,您可以尝试实现所有这些,然后对它们进行基准测试。这会给你最多的 objective 答案。
假设我有一个 C 库,用于从 brick
中构建 house
。与每个 brick
相关联的是一组 double
s 和 int
s,对应于它的尺寸、重量、颜色以及它来自哪批货物等。house
是然后只是某种形式的有组织的积木收集。我的房屋建筑库中的一些功能接收 house
,但大多数接收并运行 bricks
; house
主要使用本地 brick
-wise 操作构建,对应于 adding/removing 一块砖头等本地更改。
在我(软弱、缺乏经验)看来,有两种“自然”的方式来表示这种 house
-made-of-brick
s 的数据结构设置。
做法一:大透明砖,小房子。让每个 brick
结构包含每个关联的 double
s 和 int
s 的字段,以及指向紧邻它的砖块的指针。在此设置中,与 house
相比,每个 brick
都是一个大结构(house
可以想象只是指向任何 brick
的指针),整个事情是只是一大堆指针。
方法二:小不透明砖,大房子。让每个 brick
只包含一个整数 index
和一个指向其所属 house
的指针; house
然后包含 double
s 和 int
s 的数组,brick
s 可以切入这些数组以获取它们的数据,再加上一些额外的 arrays/tables所有连接信息。通过这种方法,无论我们在代码中的什么位置,都可以使用大型 house
结构来保存和管理资源,每个 brick
都可以看到该结构。
问题:在什么情况下(如果有)方法 1 优于方法 2?
我非常喜欢方法 2,但很难准确说明是什么使它在客观上 比方法 1 更好。在此先感谢您的任何建议 and/or 指向适当阅读的指针 material。关于如何更好地表达我的问题的建议也非常受欢迎:)
正如其他人所指出的,您正在描述一个图问题,并询问用哪种方法来表示这个图。但是,您的问题没有指定您要实现的应用程序。以下是我想到的几种情况:
1) 应用程序更关心房子而不是每一块砖:例如,你想计算房子的某些指标,大部分砖来自哪里,房子的最终尺寸是多少,那么第二种方法将更能代表您要解决的问题。因此更容易实施和维护。
2) 将积木视为独立实体至关重要。该应用程序更关心删除、移动或更一般地在砖块级别而不是房屋级别上进行操作。那么第一种方式更合适
您提出了两个极端,但可能也有介于两者之间的方法。例如,您可以将邻接信息存储在房屋中,但将有关颜色、重量、大小和来源的信息保存在砖块中。您还可以将源信息从 house 和 brick 结构中移出,并将其放入单独的结构中,例如表示源并包含指向砖的指针列表的结构。
你不能说 objective 哪种方法更好,直到你说出你想要优化的目标。阿德米已经提到了两个可能的目标,但可能还有更多。 然后问题也是您要优化的参数:它是性能吗?代码大小?运行时内存使用情况?代码清晰度?
一旦您定义了您的目标,并且您有两个或更多的替代实现可供选择,您可以尝试实现所有这些,然后对它们进行基准测试。这会给你最多的 objective 答案。