【问题标题】:C# which data structure is suitable for efficient querying in both ways(forward and backward)C#哪种数据结构适合双向高效查询(向前和向后)
【发布时间】:2020-06-15 06:07:47
【问题描述】:

我正在考虑如何为这种情况决定数据结构。

在我的应用程序(一种机器学习应用程序)中,存在三个类 ImageDataLabelDataClassData。 并且需要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 循环。如果这个程序处理数千张图片,它会变慢。

所以我的问题是ImageDataLabelDataClassData 是否有更好的实现来提高效率。例如,i) 程序处理图像列表、标签列表、类列表; ii) 并额外处理其他连接索引容器,如Tuple&lt;int, int&gt; LabelImageIndicesTuple&lt;int, int&gt; LabelClassIndices

哪些数据结构适合这个问题? 或者我可以找到哪些关键字来解决这个问题? 谢谢!!!

【问题讨论】:

  • 每个标签是否只与一张图片相关?
  • List 将最适合您的要求
  • @grek40 是的,标签不应共享给多个图像
  • 你的问题不清楚。你问如何初始化一个相互递归的数据结构?无论如何,在尝试之前不要假设一个简单的实现会太慢。
  • 我认为这里对某些功能存在误解...您提到 "_images.Sum(~) 暗示了 _images" 的 foreach 循环,但您似乎没有不要意识到.Count(~) 也会循环遍历您的数据。所以,我建议你给我们一些数字......你想减轻的性能影响有多严重?出现问题时涉及多少图像/标签/类?

标签: c# data-structures


【解决方案1】:

如果它是一个关系模型,您将拥有 3 个与您的图表完全相同的实体。图像、类和标签。唯一的区别是标签不会被任何其他实体“拥有”,而是通过引用列表和图像以自己的权利存在。您需要约束来强制执行某些规则。

通过这样做,您可以根据需要对任何实体运行查询。

在 SQL 中,您将拥有针对 Lable.PK、Label.ClassID、Lable.ImageID 的索引以帮助提高性能。在 LINQ 中,您需要选择更好的结构,例如 IDictionary 派生类,但显然可以制作一个列表。

【讨论】:

  • 你能检查一下修改后的问题吗? (下面“=== 修改===”)
猜你喜欢
  • 2012-11-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-08
  • 2015-04-22
  • 1970-01-01
  • 2014-01-03
  • 1970-01-01
相关资源
最近更新 更多