Questions tagged «data-structures»

有关在软件应用程序中有效存储和表示数据的问题。


2
我应该如何在一个宁静的服务中设计一个有序列表资源?
我一遍又一遍地遇到了同样的问题,但我还没有找到我真正认为是最佳的解决方案。 在应用中说,您有一个有序列表,然后让用户通过拖放等方式更改该顺序。您希望顺序中的更改得以保留。您如何建模? 如何设计有序列表资源的静态服务? 特别是,我应该如何设计list和item宁静的资源的模型?我见过的最常见的设计是item具有order或position属性的实体。我听到的另一种方法是在商品上使用双链表。 什么是一种方法,它不会向数据库写入太多内容,并且通常可以为客户端快速更新和读取?端点应该如何暴露?

3
链表应始终具有尾指针吗?
我的理解... 优点: 在末尾插入的是O(1)而不是O(N)。 如果列表是双链表,则从末尾删除也是O(1)而不是O(N)。 坏处: 占用很少的额外内存:4-8个字节。 实施者必须跟踪尾巴。 从这些优点和缺点来看,我看不出为什么链表会避免使用尾部指针。有什么我想念的吗?

2
您将使用什么数据结构来表示有机化合物?
是否有任何可以用来表示分子的良好数据结构? 我当时想也许我可以通过使每个原子成为一个顶点来表示为图,但是,有机化合物通常含有大量的碳和氢。你怎么编号?是否存在代表分子的好方法,但同时又有一种有效的.contains()方法? 最基本的用途之一是检查化合物是否含有羰基,苄基氢或什至苯环。

2
是否可以通过使用二进制搜索树进行单独链接来加快哈希表的速度?
我想使用二进制搜索树实现哈希表,以减少从O(n)(使用链表)到O(log n)(使用BST)的单独链接过程中的搜索复杂性。可以这样做,如果可以,怎么办?如果解决方案是逐步实施的,则逻辑将更容易理解。 我想减少哈希表中的“搜索”时间(使用单独的链接进行构建),但同时我不想增加插入时间。对于我的项目,我无法更改哈希函数以减少冲突。但是由于可伸缩性,冲突正在发生。我试图找到一种解决方法,以便在发生冲突的情况下以某种方式使用最佳访问并插入时间...即管理事物的当前状态,而不是重构整个算法。如果没有成功,则必须进行重组。有什么想法吗?

2
如何表示在节点和可以有选择地消失的边之间允许有多个边的图
我正在尝试找出用于建模一些假设的理想化网络使用情况的数据结构。 在我的方案中,许多互相敌对的用户都试图组成已知所有潜在连接的计算机网络。但是,一个用户需要连接的计算机可能与另一用户需要连接的计算机不同;用户1可能需要连接计算机A,B和D,而用户2可能需要连接计算机B,C和E。 在NCTM Graph Creator的帮助下生成的图像 我认为其核心将是无向循环图,其中节点表示计算机,边缘表示以太网电缆。但是,由于场景的性质,有一些不常见的功能可以排除邻接表和邻接矩阵(至少,没有进行不重要的修改): 边缘可能会限制使用;也就是说,如果一个用户获得了给定的网络连接,则其他任何用户都不能使用该连接 在该示例中,绿色用户可能无法连接到计算机A,但是红色用户已将B连接到E,尽管它们之间没有直接链接 在某些情况下,一对给定的节点将通过多个边连接 在该示例中,有两条独立的电缆从D到E,因此绿色和蓝色用户都可以直接连接这些计算机。但是,红色不再能建立这种联系 如果两台计算机通过一根以上的电缆连接,则每个用户最多只能拥有其中一根电缆 我需要在此图上执行一些操作,例如: 确定是否为给定用户连接了任何特定的计算机对 确定给定用户连接目标计算机的最佳路径 识别给定用户的最高延迟计算机连接(即最长路径而不分支) 我的第一个想法就是简单地创建所有边缘的集合,但这对于搜索来说是很糟糕的。我现在想做的最好的事情就是修改一个邻接表,以使列表中的每个项目不仅包含边长,还包含其成本和当前所有者。这是明智的做法吗?假设空间不是问题,那么创建图的多个副本(每个用户一个)而不是单个图是否合理?


3
从架构上讲,诸如Microsoft的Entity Framework之类的数据库抽象层是否使对单独的数据访问层的需求无效?
原来的样子 多年以来,我一直在组织软件解决方案,例如: 数据访问层(DAL),用于抽象访问数据的业务 业务逻辑层(BLL),用于将业务规则应用于数据集,处理身份验证等。 实用程序(Util)只是我逐渐建立的常用实用程序方法的库。 表示层当然可以是Web,桌面,移动等。 现在的样子 在过去的四年左右的时间里,我一直在使用Microsoft的Entity Framework(我主要是.NET开发人员),并且由于Entity Framework已经完成了DAL工作,因此我发现拥有DAL变得越来越麻烦。我的DAL曾经做过的工作:它抽象了针对数据库运行CRUD的业务。 因此,我通常以一个DAL结束,该DAL具有如下方法的集合: public static IQueryable<SomeObject> GetObjects(){ var db = new myDatabaseContext(); return db.SomeObjectTable; } 然后,在BLL中,该方法将按如下方式使用: public static List<SomeObject> GetMyObjects(int myId){ return DAL.GetObjects.Where(ob => op.accountId == myId).ToList(); } 当然,这是一个简单的示例,因为BLL通常会应用多行逻辑,但是在这样有限的范围内维护DAL似乎有点多余。 放弃DAL并像这样简单地编写我的BLL方法会不会更好: public static List<SomeObject> GetMyObjects(int myId){ var db = new myDatabaseContext(); return db.SomeObjectTable.Where(ob …

5
函数式编程中的数据结构
我目前正在使用LISP(尤其是Scheme和Clojure),并且想知道函数式编程语言中如何处理典型的数据结构。 例如,假设我想使用图形寻路算法解决问题。通常如何用一种功能编程语言(主要是对可以应用于LISP的纯功能样式感兴趣)来表示该图?我是否会完全忘记图并以其他方式解决问题?

5
我应该为该缓存策略使用哪种数据结构?
我正在使用.NET 4.0应用程序,该应用程序在返回双精度数的两个双精度数上执行相当昂贵的计算。对数千项中的每一项执行此计算。这些计算是在Task线程池线程上执行的。 一些初步测试表明,一次又一次地执行相同的计算,因此我想缓存n个结果。当缓存满了,我想抛出了最不经常最近使用的项目。(编辑:我意识到至少经常没有意义,因为当缓存已满并且我将结果替换为新计算的结果时,那个结果将是最不常用的,并在下次计算新结果时立即替换并添加到缓存中) 为了实现这一点,我正在考虑使用Dictionary<Input, double>(其中Input将存储两个输入double值的微型类)存储输入和缓存的结果。但是,我还需要跟踪上次使用结果的时间。为此,我认为我需要第二个存储信息的集合,以便在缓存已满时从字典中删除结果。我担心不断对清单进行排序会对性能产生负面影响。 有没有更好的方法(例如性能更高的方法),或者甚至是我不知道的通用数据结构?为了确定解决方案的最优性,我应该进行哪些类型的分析/测量?

4
为什么MS Data Access故事如此破裂?它是数据访问的性质还是仅仅是MS?
这个StackOverflow问题询问“我可以在哪里获得Microsoft.Data.Objects” 事实证明,答案可能是它在Entity Framework 4的CTP4(代码优先)版本中。但是,有很多猜测。包含 系统数据 实体框架 Microsoft.ApplicationBlocks.Data Microsoft.Practices.EnterpriseLibrary.Data 10年前,如果有人问类似的问题,因为他们可能已经获得了DAO,RDO,ADO。 这只是野兽的本性还是MS。 其他供应商也会发生这种情况吗?基本数据访问策略在哪里包装或更改?

2
在具有不可变数据的语言中对双向链接或循环数据结构实施操作的解决方法
我想学习如何在Haskell中制作图并对其执行一些本地操作,但是问题不是特定于Haskell的,我们可以考虑使用双链表来代替图。 问题:用 主要支持和倡导不可变数据结构(Haskell,Clojure等)的语言,惯用或推荐的方式来实现双链表(或其他双链或循环数据结构)及其操作。 ?特别是,如何使用语言正式禁止的就地更新? 我很容易想到,如果对双向链接列表执行某些本地操作(例如,如果插入了一个项目),由于语言的惰性,可能不需要立即复制整个列表。但是,由于列表是双重链接的,因此如果在一个地方进行修改,则旧节点都不能在列表的新版本中使用,因此,迟早需要对它们进行标记,复制和垃圾收集。显然,如果仅使用列表的更新副本,则这些操作是多余的,但是它们会增加与列表大小成比例的“开销”。 这是否意味着对于此类任务,不可变数据根本不合适,并且对可变数据没有“本地”支持的功能性声明语言不如命令式语言那么好?还是有一些棘手的解决方法? 附言:我已经在互联网上找到了一些有关该主题的文章和演示,但是很难追踪它们,而我认为这个问题的答案不应该超过一个段落或者是一个图表...我的意思是,如果有对于此问题,没有“功能性”解决方案,答案可能是“使用C”。如果有一个,那么它有多复杂? 相关问题 “函数式编程中的数据结构”。此处没有讨论我有关使用就地更新而不是效率低下的替代方案的具体问题。 “持久性数据结构的内部变异”。那里的重点似乎是用一种未指定的语言进行的低级实现,而我的问题是关于一种语言(功能语言或其他功能)的正确选择以及功能语言的可能惯用的解决方案。 相关报价 纯粹的函数式编程语言允许非常简洁地表达许多算法,但是在少数算法中,就地可更新状态似乎起着至关重要的作用。对于这些算法,缺乏可更新状态的纯功能语言似乎固有地效率低下([Ponder,McGeer and Ng,1988])。 -约翰·劳伯伯里(John Launchbury)和西蒙·佩顿·琼斯(Simon Peyton Jones),《懒惰的功能状态线程》(1994),还有约翰·劳伯伯里和西蒙·佩顿·琼斯,《哈斯克尔州》(1995)。这些论文ST在Haskell中介绍了Monadic类型构造函数。

1
算法/数据结构来回答“我可以用这套配料制作什么食谱?”
形式上,令s(U,Q)= { V | V ∈ ù和V ⊆ Q },其中ü,Q,和V都表示集,和ü,更具体而言,代表一组套。举例来说,U可能是食谱中各种配方所需的一组(一组)配料,其中Q代表一组配料,我有V表示我可以用这些配料制作的配方。查询s(U,Q)对应于“这些成分我能做什么?”的问题 我正在寻找的是一个数据表示该指标ü以这样一种方式,它支持高效的查询小号(ü,Q),其中Q和全体成员ü一般会比较小到所有成员的工会ü。另外,我希望它能够有效地更新U(例如,添加或删除配方)。 我忍不住想必须很好地理解这个问题,但是我找不到它的名称或参考。有谁知道有效解决此问题的策略,或者我可以在此获得更多了解的地方? 就考虑解决方案而言,我曾想过要为集合U建立决策树。在树的每个节点上,问题“您的成分表中是否包含x?” 将要求选择x来最大化被答案消除的U成员的数量。随着U的更新,将需要重新平衡决策树以最小化找到正确结果所需的问题数量。另一个想法是用一个n维布尔“八叉树”(其中n是唯一成分的数量)表示U。 我相信“用这些成分可以制成哪些食谱?” 可以通过以下方法得到答案:将食谱中的食谱(所需的成分集)的笛卡尔乘积与一个成分具有的幂集相乘,然后对两个元素均相等的对进行过滤以得到有序对,但是这不是一个有效的解决方案,我要问的是如何优化这种操作;如何在SQL中将其组合为有效的?SQL怎么做才能使其高效? 尽管我使用的是食谱和一组配料的食谱,但我预计尽管配料的数量很多,但“食谱”和“配料”的数量将非常大(每种多达数十万)在给定的配方中,给定的配料集中的配料数量将相对较小(典型的“食谱”大约为10-50,典型的“配料”大约为100)。另外,最常见的操作将是查询s(U,Q),因此它应该是最佳的。这也意味着,需要检查每个配方或对每种成分进行操作的蛮力算法本身会很不理想。通过巧妙的缓存,

3
什么是哈希圣经?
在哈希表和哈希表上是否有类似Cormen的参考书?由于某种原因,这种特殊的结构在我的CS教育中很少受到关注,但是我想学习更多,因为它们似乎无处不在。我知道Cormen会介绍它,但我正在寻找更专业,更深入的内容。

4
好的代码风格可在任何地方引入数据检查?
我有一个足够大的项目,我再也无法保持每个方面的头脑。我正在处理其中的许多类和函数,并且正在传递数据。 随着时间的流逝,我注意到我一直在出错,因为我忘记了将数据传递给不同的函数时数据必须具有的精确格式(例如,一个函数接受并输出一个字符串数组,另一个函数是我后来写的,接受保留在字典等中的字符串,因此我必须将正在使用的字符串从数组中的字符串转换为字典中的字符串)。 为了避免总是要弄清楚什么地方断了,我开始将每个函数和类都视为“孤立实体”,因为它不能依赖外部代码为其提供正确的输入,而必须自己执行输入检查(或,在某些情况下,如果数据格式错误,请重铸数据。 这大大减少了我花费在确保传递的数据“适合”每个函数上的时间,因为当某些输入不正确(有时甚至纠正)时,类和函数本身会警告我,而我不会必须与调试器一起遍历整个代码,以找出问题的根源。 另一方面,这也增加了整体代码。 我的问题是,此代码样式是否适合解决此问题? 当然,最好的解决方案是完全重构项目,并确保数据具有所有功能的统一结构-但是由于该项目不断增长,因此我最终将花费更多的时间并担心干净的代码,而不是实际添加新内容。 (仅供参考:我仍然是一个初学者,因此,如果这个问题太天真,请原谅;我的项目是使用Python。)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.