Questions tagged «data-structures»

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

3
将一组相关的属性包装到其自己的struct / class中是一种好习惯吗?
用Swift编写User对象,尽管我的问题与任何强类型语言有关。用户可以拥有一堆链接(FacebookProfile,InstagramProfile等)。有关此问题。 将链接包装在其自己的对象中是一种好习惯吗? struct用户{ var firstName:字符串 var lastName:字符串 var email:string var链接:链接 } 结构链接{ var facebook:字符串 var instagram:字串 var twitter:字符串 } 还是应该松散?从技术上讲,我知道这两种方法都很好,但是总体上想知道是否有推荐的方法,尤其是为了提高可读性。 struct User { var firstName: string var lastName: string var email: string var facebookLink: string var twitterLink: string var instagramLink: string } 在这种情况下,链接应该是集合/列表吗?我认为它不应该是一个列表,因为有固定数量的链接选项可用,并且数量不会增加。我的想法对吗? 将我的网络方法放置在User对象(例如getUsers,getUser,updateUser)内是否是一种好习惯? 我知道这些可能是主观的,但是我试图了解在类似情况下的最佳实践是什么。将不胜感激任何指针。

3
是否存在用于管理深层多对多关系的设计模式?
我在定义这个数据模式时遇到了麻烦,在多个应用程序上工作时遇到了麻烦。 它包括: 由许多对象本身组成的对象类型 第二种对象类型,其中每个实例“具有很多”第一个对象 并且,每个对象的每个关联都可以将第一对象的每个子对象修改为第二对象类型。 一个简单的示例可能是: 一门编程课程,包含一组课程 这些课程由一组作业组成。 可以将课程分配给学生。 但是,一旦将课程分配给学生,则可以通过删除和添加为该学生定制每个课程和/或作业,以至于原始课程可能无法识别。 在我的解决方案中,结果是: 将课程分配给学生后,该课程将加载到内存中。然后,对于每个子对象,使用适当的元数据生成学生/子对象关系对象。本质上,我使用原始对象作为模板来生成所需的可自定义对象。 随着子对象变得更加复杂和编号,这将导致大量数据。我想知道是否存在一些优化或模式,以减少处理此数据模式所需的逻辑/复杂度。

3
干净的代码和混合对象以及功能嫉妒
因此,我最近对代码进行了一些重大的重构。我试图做的主要事情之一就是将类分为数据对象和辅助对象。除其他外,这是由“ 清洁代码”的这一部分启发的: 杂种 这种混乱有时会导致不幸的混合数据结构,即一半对象和一半数据结构。它们具有执行重要功能的函数,也具有公共变量或公共访问器和更改器,它们出于所有意图和目的,将私有变量公开,从而诱使其他外部函数以程序程序将要使用的方式使用这些变量。数据结构。 这样的混合体很难添加新功能,但是也很难添加新的数据结构。他们是两全其美的。避免创建它们。它们表示设计混乱,其作者不确定(或者更糟,是无知)他们是否需要保护功能或类型。 最近,我正在查看我的一个工作对象(恰好实现了Visitor模式)的代码,并看到了: @Override public void visit(MarketTrade trade) { this.data.handleTrade(trade); updateRun(trade); } private void updateRun(MarketTrade newTrade) { if(this.data.getLastAggressor() != newTrade.getAggressor()) { this.data.setRunLength(0); this.data.setLastAggressor(newTrade.getAggressor()); } this.data.setRunLength(this.data.getRunLength() + newTrade.getLots()); } 我立即对自己说:“功能令人羡慕!这种逻辑应该在Data类中-特别是在handleTrade方法中。handleTrade并且updateRun应该始终一起发生”。但是后来我想到“数据类仅仅是一个public数据结构,如果我开始这样做,那么它将成为一个混合对象!” 有什么更好的,为什么?您如何决定该做什么?

5
重复的四叉树
我正在实现一个四叉树。对于那些不知道此数据结构的人,我包括以下简短描述: 四叉树是一种数据结构,在欧几里得平面中就像3维空间中的八叉树一样。四叉树的常见用途是空间索引。 总结一下它们是如何工作的,四叉树是一个集合(假设这里是矩形),具有最大容量和一个初始边界框。当尝试将元素插入达到最大容量的四叉树中时,该四叉树被细分为4个四叉树(其几何表示将比插入前的树小四倍)。每个元素根据其位置重新分配在子树中。使用矩形时的左上边界。 因此,四叉树要么是叶子,其元素数量少于其容量,要么是一棵有4个四叉树作为孩子的树(通常是西北,东北,西南,东南)。 我担心的是,如果您尝试添加重复项,可能是同一元素多次或具有相同位置的多个不同元素,则四叉树在处理边缘时存在一个基本问题。 例如,如果您使用容量为1的四叉树并将单位矩形作为边框: [(0,0),(0,1),(1,1),(1,0)] 然后您尝试插入两次以其左上边界为原点的矩形:(或类似地,如果尝试在容量为N> 1的四叉树中将其插入N + 1次) quadtree->insert(0.0, 0.0, 0.1, 0.1) quadtree->insert(0.0, 0.0, 0.1, 0.1) 第一次插入不会有问题: 但是然后第一个插入将触发细分(因为容量为1): 因此,两个矩形都放在同一子树中。 然后,这两个元素将到达相同的四叉树并触发细分… 依此类推,依此类推,细分方法将无限期地运行,因为(0,0)始终位于所创建的四个子树中的同一子树中,这意味着将发生无限递归问题。 有可能有重复的四叉树吗?(如果没有,则可以将其实现为Set) 我们如何解决这个问题而又不完全破坏四叉树的体系结构?

1
我们自己的API的最佳数据结构
我处于为Stack Exchange网络编写Emacs主要模式的早期阶段; 如果您定期使用Emacs,最终将使您受益。 为了最大程度地减少对Stack Exchange API的调用次数(每个IP每天最多10000次),并成为一个负责任的公民,我想缓存从网络收到的信息并将其存储在内存中,等待再次被访问。我真的对存储此信息的数据结构感到困惑。 显然,这将是一个列表。但是,与任何数据结构一样,必须由存储什么数据以及如何访问它们来确定选择。我希望能够将所有这些信息存储在单个符号中,例如stack-api/cache。因此,stack-api/cache事不宜迟,这里列出了最近更新提出的一些要点: `(<csite> <csite> <csite>) <csite>会在哪里 (1362501715 . <site>) 至此,我们所要做的就是定义一个简单的关联列表。当然,我们必须更深入。 每个<site>都是API参数列表(唯一),后跟一个列表问题: `("codereview" <cquestion> <cquestion> <cquestion>) <cquestion>您猜对了,每个问题的最新更新时间都是一个问题: `(1362501715 <question>) (1362501720 . <question>) <question>是question结构和答案列表的缺点(同样,以其上次更新时间为准): `(<question-structure> <canswer> <canswer> <canswer> 和` `(1362501715 . <answer-structure>) 这个数据结构是可能最准确地描述为一棵树,但我不知道是否有更好的方法来做到这一点考虑的语言,的Emacs Lisp(这是不是所有的从Lisp的不同,你知道,爱在所有) 。明确的提示可能是不必要的,但它可以帮助我的大脑更好地围绕它。我敢肯定<csite>,例如,它将变成 (<epoch-time> <api-param> <cquestion> <cquestion> ...) 顾虑: 这样将数据存储在潜在的巨大结构中,是否会对系统的性能进行权衡?我想避免存储无关的数据,但是我已经做了我能做的,并且我认为数据集最初并没有那么大(对于正常使用),因为它只是人类可读文本,而且比例合理。(我正计划使用列表顶部的时间来收集旧数据;每个数据源都从其子级继承其最后更新时间,然后沿树向下继承。该剔除应在多大程度上进行:我不是当然。) 像这样存储数据是否会对必须使用的数据进行性能折衷?也就是说,设置和检索操作是否会受到列表大小的影响? 关于更好的结构,您还有其他建议吗?

4
使用数据结构的算法与使用数据库的算法之间有什么区别?
一般问题 使用数据结构的算法与使用数据库的算法之间有什么区别? 一些背景 这个问题困扰了我一段时间,而我却无法给出令人信服的答案。 目前,我正在努力加深对当然会大量涉及数据结构的算法的理解。这些是基本结构,例如袋,队列,堆栈,优先级队列和堆。 我还每天使用数据库来存储最终用户已处理和提交或程序处理过的数据。我通过DAL检索和提交数据,该DAL具有自己的数据结构,该结构是根据数据库中的表生成的。 当我可以选择使用数据库对数据进行排序以按升序/降序将其发送回给我或检索并将数据加载到我的逻辑中,在优先级队列中处理此数据并进行堆排序时,我的问题就来了所有的。或者另一种方法是使用数据库搜索记录,而不是加载记录的子集并使用诸如二进制搜索之类的方法来查找我感兴趣的一个或多个记录。 在我看来,由于通信成本很高,因此在发送数据库端之前,我将尝试在数据库端进行尽可能多的操作。这也使我想知道您何时使用严格在自己的逻辑内定义的算法和数据结构,而不是处理数据库而不是数据库的数据? 所以这是问题... 问题 数据结构和数据库之间有什么区别? 我们什么时候使用的算法仅使用您自己的逻辑而不是数据库逻辑定义的数据结构? @Harvey发表:什么时候数据库中的方法变得比您自己的逻辑中的方法效率低? @mirculixx帖子:什么使方法有效? @Harvey帖子:处理具有数据结构的数据比在数据库中处理数据更快? 澄清说明 @Grant帖子:我通常使用的数据库是关系数据库,这些问题来自于它们的使用。但是,我确实认为这些问题适用于任何持久性框架(当我说框架时,我的意思是最一般的意义)。 我知道没有特定上下文的答案很难。我正在寻找有想法的食物,建议或讨论要点,将不胜感激!


4
在半径范围内寻找房屋
在一次采访中,我被问到以下信息:一个房地产应用程序,列出了给定距离内(例如,用户希望在20英里内找到所有房屋)当前在市场上(即待售)的所有房屋,您将如何设计应用程序(数据结构和对数)以构建此类服务? 有任何想法吗?您将如何实施?我告诉他,我不知道,因为我之前从未做过任何与地理相关的事情。

8
数组和堆栈有什么区别?
根据维基百科,一个堆栈: 是后进先出(LIFO)抽象数据类型和线性数据结构。 而数组: 是由一组元素(值或变量)组成的数据结构,每个元素均由至少一个数组索引或键标识。 据我了解,它们相当相似。那么,主要区别是什么?如果它们不相同,那么数组不能做什么,而栈不能做什么呢?

8
存储在数据库中的任务的优先级列表
我正在尝试执行以下操作的最佳方法: 我有一个存储在数据库中的任务列表。任务具有分配的优先级。您可以更改任务的优先级,以重新排序执行任务的顺序。 我在想与Pivotal Tracker非常相似的东西。 因此,假设我们有以下内容: 1 Task A 2 Task B 3 Task C 4 Task D 5 Task E 我们认为E现在是最重要的任务 1 Task E 2 Task A 3 Task B 4 Task C 5 Task D 我需要更新所有5个任务以赋予它们新的优先级。 如果任务B变得更加重要,那么我将拥有AI 1 Task E 2 Task B 3 Task A 4 Task C …

2
功能语言的二维棋盘游戏的数据结构
我正在用功能编程语言Elixir 创建一个简单的MiniMax实现。因为有很多完美知识的游戏(井字游戏,四连冠,西洋跳棋,国际象棋等),所以此实现可能是为任何这些游戏创建游戏AI的框架。 但是,我面临的一个问题是如何以功能语言正确存储游戏状态。这些游戏主要处理二维游戏板,其中经常执行以下操作: 阅读特定板位的内容 更新特定板位置的内容(返回新的移动可能性时) 考虑连接到当前位置的一个或多个位置的内容(即下一个或上一个水平,垂直或对角线位置) 考虑任何方向上多个连接位置的内容。 考虑整个文件,等级和对角线的内容。 旋转或镜像电路板(以检查对称性,以提供与已经计算出的结果相同的结果)。 大多数功能语言都使用链接列表和元组作为多元素数据结构的基本构建块。但是,这些似乎对这项工作非常不利: 链接列表具有O(n)(线性)查找时间。另外,由于我们无法在板上进行一次扫描来“扫描和更新板”,因此使用列表似乎非常不切实际。 元组具有O(1)(恒定)查找时间。但是,将电路板表示为固定大小的元组将使得很难遍历等级,文件,对角线或其他类型的连续正方形。此外,Elixir和Haskell(这是我所知道的两种功能语言)都缺乏读取元组的第n个元素的语法。这将使得不可能编写适用于任意尺寸电路板的动态解决方案。 Elixir具有内置的Map数据结构(而Haskell具有Data.Map),该结构允许O(log n)(对数)访问元素。现在,我使用一个地图,其中x, y以位置表示键的元组。 这是“可行的”,但是以这种方式滥用地图是错误的,尽管我不知道确切的原因。我正在寻找一种以功能性编程语言存储二维游戏板的更好方法。

1
为复杂的工作时间表建模
我遇到了一个现实世界的问题,我试图代表并实现自动化。我已经将其简化并抽象为以下内容: 有n个工作地点(P1,P2,...,Pn)。 每个位置Pn都有一个密钥Kn。 有m个工人(W1,W2,...,Wm)。 为了在Pn工作,工人必须持有Kn。 每个密钥既可以由工作人员持有,也可以留在交易所E中。 工人可以随时到交易所旅行,以拿起一些无人认领的钥匙或放下一些钥匙以供其他人使用。 现在,必须严格执行外部工作计划。例如: 2016-04-21 W1必须在P6工作 2016-04-21 W2必须在P3工作 **需要交换钥匙** 2016-04-22 W3必须在P3工作 2016-04-22 W2必须在P6工作 任何数量的工人都可能必须在其计划的某个时间在Pn工作,尽管从来没有在同一天 我们知道: 所有键的起始位置,包括工作人员或E 每个工人必须履行的未来工作指令 因此,我正在努力为整个情况建模。您能提出我应该考虑的数据结构和算法,以便掌握它并开始优化每个工人的交易所旅行吗? 我要最小化的是去E的行程总数。第二个目标是确保没有工人进行不成比例的行程。 提前致谢!!

1
银行实际上将什么用作货币数据类型?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 4年前关闭。 我知道一些不错的选择: 大整数(例如int64_t,mpz_t,任何bignum lib)代表美分或10 -n美分-例如,整数代表1分钱的1分钱(1.05美元== 10500)。这称为缩放整数。 用于任意精度十进制算术的高级库,例如Java中的BigDecimal,Python中的Decimal,Javascript中的decimal.js,C ++中的boost :: multiprecision 字符串。 打包的BCD(二进制编码的十进制)是一种更加神秘的方法,在旧软件中似乎很流行。了解 更多 关于它。 在银行(或信用卡,ATM,POS系统)的生产代码中,实际使用最多的数据类型是什么?我特别要问那些为银行工作的人。 编辑:对于那些具有相同问题域的超级有用的链接(需要实现不中断的“金钱”数据结构)。 http://martinfowler.com/eaaDev/quantity.html http://www.codeproject.com/Articles/28244/A-Money-type-for-the-CLR http://c2.com/cgi/wiki?MoneyObject http://www.setfiremedia.com/blog/7-top-tips-for-coding-with-currency http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html 编辑说这是一个重复问题的同伴:这是一个实际的问题,而不是“什么是最好的”的理论问题。阅读我问题的未编辑标题。我问的是人们在银行的代码库中亲眼目睹了什么。 我知道BigDecimal显然是“最佳”的,但是类似的漂亮API并非随处可见,不管您信不信,并且十进制库相对于int而言昂贵。

4
存储数据的最有效方法是什么?
我负责重写一些旧的VB代码。我了解它是如何工作的,但是我觉得有一种更有效的方法来完成他们的工作。我只是不知道那是什么。这是一个人为的示例,它在数据需求方面确实与我需要做的相似。 用户必须在GUI中挑选汽车的制造商,制造商,型号和颜色。我有一个很大的文本文件,看起来像这样: Ford Truck F150 red Ford Truck F150 blue Ford Truck F150 black Ford Truck F150 silver Ford Truck F250 red Ford Truck F250 green Ford Sedan Taurus red Ford Sedan Taurus green Ford Sedan Taurus white Ford... ... Subaru SUV Forester blue Subaru SUV Forester red Subaru SUV …

2
Haskell的内存中数据存储
我想在Haskell中为Web服务实现内存中的数据存储。我想在STMmonad中运行事务。 当我在Google 哈希表Steam Haskell上搜索时,我只会得到以下信息:Data. BTree. HashTable. STM.模块名称和复杂性表明这是作为树实现的。我认为对于可变哈希表,数组应该更有效。 是否有理由避免将数组用于STM哈希表?我可以通过此Steam哈希表获得任何收益,还是应该仅使用Steam ref来引用IntMap?

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.