【发布时间】:2020-06-15 06:07:47
【问题描述】:
我正在考虑如何为这种情况决定数据结构。
在我的应用程序(一种机器学习应用程序)中,存在三个类 ImageData、LabelData 和 ClassData。
并且需要ImageData 列表和ClassData 列表,可能还需要LabelData 列表。
他们的关系如图所示链接(缺乏声誉......)。 Images, Labels and Classes
- 该程序有一个图像列表
- 程序有一个类列表
- 每张图片都有多个标签
- 每个标签都表示类列表中的一个类(按引用类型)
所以我构造了这样的数据结构:
class ImageData {
public List<LabelData> Labels {get; set;}
}
class LabelData {
ClassData ClassData {get; set;}
}
如果我计算“每个类别的单个图像中有多少个标签”,似乎还可以。 但是,如果我计算“所有图像中每个类有多少标签”,这似乎有点低效,因为需要一个图像循环。我知道 LINQ 可以解决这个问题,但我想在数据结构方面存在更有效的方法。
欢迎任何 cmets,或者请让我知道解决此问题的任何关键字。 谢谢!
=====================修改! =======================
其他人说的不太清楚,所以我添加了更具体的例子。
申请条件:
- 该程序处理多个图像。
- 用户可以为图像绘制标签。
- 多个标签可以绘制到单个图像。
- 该程序处理多个类,并且必须先将标签分配给这些类之一,然后才能在图像上绘制。
目前,我实现了如下类
class ImageData {
public List<LabelData> Labels {get; set;}
public string ImagePath {get; set;}
// constructor
public ImageData(string imagePath) {
Labels = new List<LabelData>();
ImagePath = imagePath;
}
}
class LabelData {
public ClassData ClassData {get; set;}
// constructor
public LabelData(ClassData classData) {
ClassData = classData
}
}
class ClassData { }
我的应用程序的数据如下:
private List<ImageData> _images;
private List<ClassData> _classes;
问题来了。在我的程序中,我想显示一些统计数据,例如标签数量。
首先,如果用户想知道“单个图像中的标签数(_images[0])分配为单个类(_classes[0])”:
_images[0].Labels.Count(v => v.ClassData == _classes[0])
这不是第一种情况的问题,但其次,如果用户想知道“分配为单个类的所有图像中的标签数量(_classes[0]):
_images.Sum(v => v.Labels.Count(x => x.ClassData == _classes[0]))
但是,我认为第二种情况的这种实现效率不高,因为_images.Sum(~) 暗示了_images 的foreach 循环。如果这个程序处理数千张图片,它会变慢。
所以我的问题是ImageData、LabelData 和ClassData 是否有更好的实现来提高效率。例如,i) 程序处理图像列表、标签列表、类列表; ii) 并额外处理其他连接索引容器,如Tuple<int, int> LabelImageIndices、Tuple<int, int> LabelClassIndices。
哪些数据结构适合这个问题? 或者我可以找到哪些关键字来解决这个问题? 谢谢!!!
【问题讨论】:
-
每个标签是否只与一张图片相关?
-
List将最适合您的要求 -
@grek40 是的,标签不应共享给多个图像
-
你的问题不清楚。你问如何初始化一个相互递归的数据结构?无论如何,在尝试之前不要假设一个简单的实现会太慢。
-
我认为这里对某些功能存在误解...您提到 "
_images.Sum(~)暗示了_images" 的 foreach 循环,但您似乎没有不要意识到.Count(~)也会循环遍历您的数据。所以,我建议你给我们一些数字......你想减轻的性能影响有多严重?出现问题时涉及多少图像/标签/类?
标签: c# data-structures