Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >是否值得尝试编写万无一失的数据结构?

是否值得尝试编写万无一失的数据结构?
EN

Software Engineering用户
提问于 2013-03-02 19:10:44
回答 3查看 616关注 0票数 3

问题

我们需要以类似于表的方式存储数据,但是我们有非常严格的空间限制(每个10k+行表的~1MB)。我们存储这样的数据:

代码语言:javascript
运行
AI代码解释
复制
ID | reviews | factor | score | interval | etc.
---+---------+--------+-------+----------+-----
 1 |     244 |    2.4 |    10 |     4268 | ...

在一个简单的二进制格式(一个一维字节数组,其中每一行的索引可以简单地通过了解每一行的长度,这是固定的)。

只有一个函数读取此数据(按其索引获取一行),只有一个函数追加一个新行(到末尾)。从表中移除项是永远不需要的(该表仅附加)。这两个功能都包含了相当数量的单元测试。

问题是:我们需要能够快速地遍历按不同列排序的行。换句话说,我们需要至少按两列对数据进行排序。

--一个简单的解决方案

为了解决这个问题,我们将实现同样是二进制数据块的索引。现在,我将通过创建只列出原始表中行的索引的有序数据结构来直观地做到这一点:

代码语言:javascript
运行
AI代码解释
复制
factor_index        score_index
------------        -----------
          6                  2
          2                  1
          3                  6
          1                  4
          .                  .

将新行附加到表中的函数必须更新,才能使索引也被更新。

示例:要获得按得分排序的第一项,我们只需在索引表中查找score (2)的第一个值,并从原始表中获得相应的行(如果我们同意该表是零索引的,则为第三行)。

然而,有人建议我采取不同的办法。

--一个更复杂但更安全的

版本

我们不只是存储索引,而是在每个索引表中复制ID字段:

代码语言:javascript
运行
AI代码解释
复制
factor_index | ID        score_index | ID
-------------+---        ------------+---
          6  | 46                  2 |  8
          2  |  8                  1 | 14
          3  | 91                  6 | 46
          1  | 14                  4 | 60
          .  |  .                  . |  .

然后保持原始表按ID排序,并仅将索引用作原始表中二进制搜索的起始位置。

添加新记录的函数现在必须按ID执行二进制搜索,以查找插入新行的位置,并使索引更新。

为了获得按分数排序的第一项,我们在索引表中查找分数(2,8)的第一行,并使用索引(2)作为表中二进制搜索的起始位置。如果数据是有效的,我们甚至不需要进行二进制搜索,因为在位置2,我们将找到ID为8的行。但是,如果我们发现位置2的记录有不同的索引,我们继续进行二进制搜索以找到正确的数据,并记录错误。

这种方法的论点是,即使索引指向表中的错误行,它也会工作。

不过,我很难相信这种方法确实更好,原因如下:

  • 它需要一个二进制搜索,这可能是一个新的bug来源。
  • 它要求保持表的有序性,这意味着更复杂的插入(相对于简单的附加)。
  • 它并不能防止主表出现故障:如果出现这种情况,索引甚至可能无法通过二进制搜索找到记录。
  • 它需要编写(和测试)从未打算运行的代码。
  • 它使用的数据比所需的要多。

问题

对于我们的应用程序来说,非常高的优先级是,上面的数据始终是有效的。但是,这是否有理由编写更复杂的数据结构和查找机制,以防止可能发生或不可能发生的边缘情况?难道不应该把时间和精力花在为更简单的版本编写更健壮的测试用例上吗?

EN

回答 3

Software Engineering用户

回答已采纳

发布于 2013-03-02 22:09:02

如果我正确地理解了您的索引,它们不是存储它们的最有效的方法。

无论如何,你不能同时在两把钥匙上整理你的桌子,所以我认为你根本不应该试着把它分类。相反,对索引进行排序。

10k行--一个两个字节的值可以指表中的任何条目。因此,构建最初以1..10k为种子的两个数组(或表中有多少个条目)。虽然这些不是CPU意义上的指针,但无论如何都要使用它们作为指针。根据表中的值对两个数组进行排序。

Insert是通过简单地追加记录,然后重建数组来处理的。是的,这是一项相当昂贵的操作,但是由于您已经指定了数组,所以数组并不大,不能增长太多,因此不应该经常这样做。你做的任何事都是天生的至少O(n),一个完整的度假村只有O(n log n),我会走后一条路。(你甚至可能会发现它更快,因为与移动记录相比,对主内存的写入要少得多。)

请注意,这些数组只是两个字节的值,而不是像您所指示的那样的键值对。

还有一些其他的事情也浮现在脑海中--你似乎异常关注数据的大小。这告诉我,要么您正在传输这些块(此时可以省略这些索引,因为它们可以在另一端重新创建),要么您立即在内存中存储了大量这些数据。在后一种情况下,如果您使用的是支持弱引用的语言,则可以使用它们--让块的索引没有被积极地用于垃圾收集,然后在需要时重新创建。

票数 3
EN

Software Engineering用户

发布于 2013-03-02 20:03:47

如果数据有效性至关重要,那么对数据的任何转换都必须将数据从有效状态转换为有效状态。转换机制应确保给定有效输入的输出的有效性。不成功的转换应该安全地失败,使数据处于有效状态。

单元测试只能确保在编写测试时考虑的每个条件下转换都是有效的。在所有数据转换方法中建立一致性可以确保数据在所有可能的条件下都是有效的。

因此,如果数据有效性是一个高优先级,我建议您构建始终有效的数据修改方法,并对它们进行彻底的测试。不要相信一致性是巧合。

票数 2
EN

Software Engineering用户

发布于 2013-03-03 00:00:16

首先,有一件事可以反驳你的论点:

  • 如果一个人想要像你写的那样使用ID,他肯定会首先实现一个ID到行索引(这样ID查找就不需要按特定的顺序查找原始表,并且您也不必在该表上实现二进制搜索)。

但是如果你想一想这一点,你就会发现现在你已经把原来的问题转移到了一个不同的层次--你必须确保ID到行索引没有不同步。当然,现在的优点是,当原始表的行顺序发生变化时,您可以独立地重建这个索引。这是有意义的,当你必须期待这样的变化,你知道它们何时发生,它们很少/在特定的时间点发生。

不过,这真的值得吗?当您100%确信原始表中的行号是有效且不可变的主键时,根据行号构建最简单的可能解决方案,其他一切都更容易出错和“过早无意义”。否则使用ID。

以下是一些无法确定行号是有效主键的方案:

  • 关系数据库中的行通常不会有特殊的顺序。
  • 在基于文件的场景中:数据量不断增长,由于空间限制,您必须将其拆分到多个物理表中。然后ID可能仍然是有效的主键,但行号不是。

在采用基于行号的方法时,请确保不处于这种情况。

票数 1
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/189044

复制
相关文章
jQuery限制复选框checkbox的选中次数
<div class="one"> <input type="checkbox" name="checkbox" value="A"> </div> <div class="two"> <input type="checkbox" name="checkbox" value="B"> </div> <div class="three"> <input type="checkbox" name="
明知山
2020/09/03
2.4K0
动态生成表格、隐藏表格、选中删除任意行、jquery、输入验证
我建两个相似的表是为了,给后台使用人员显示所操作的数据,同时方便把开发人员真正要操作的数据传到对应Action中,隐藏开发人员传参用的表。
微风-- 轻许--
2022/04/13
2.8K0
动态生成表格、隐藏表格、选中删除任意行、jquery、输入验证
使用 jQuery 统计用户选中的复选框的个数
微信公众号平台每个用户最多可以设置三个标签,所以在管理员给用户设置标签的时候需要统计用户的标签,下面就是使用使用 jQuery 统计用户选中的复选框的个数的方法:
Denis
2023/04/15
1.5K0
input checkbox复选框点击获取当前选中状态jquery
function checkAll(id) { //用is判断 // let checkStatus=$(id).is(':checked'); // console.log(checkStatus) //用prop方法(用attr获取不到) let checkStatus=$(id).prop("checked"); console.log(checkStatus) } html: <input type="checkbox" value="" id=
蓓蕾心晴
2018/07/06
2.5K0
jquery循环获取所有复选框,包括选中的,未选中的「建议收藏」
此处小编的是freemarker代码,不过html代码一样的,有了复选框后,要保证每个复选框的name是一致的。这样下面才能遍历
全栈程序员站长
2022/08/05
3.1K0
checkbox选中和不选中 jqu_jquery checkbox 选中不选中
jQuery是一个快速、简洁的JavaScript框架,是继Prototype之后又一个优秀的JavaScript代码库(或JavaScript框架)。jQuery设计的宗旨是“write Less,Do More”,即倡导写更少的代码,做更多的事情。它封装JavaScript常用的功能代码,提供一种简便的JavaScript设计模式,优化HTML文档操作、事件处理、动画设计和Ajax交互。
全栈程序员站长
2022/09/07
3K0
PyQt5 技巧篇-复选框绑定行内容,全选、清空、展示选中的内容功能实现演示,设置复选框选中,检查复选框选中状态
我设置两个有序序列,分别存储对应的复选框和行内容。 我的行内容是用的label标签。
小蓝枣
2020/09/22
3.7K0
PyQt5 技巧篇-复选框绑定行内容,全选、清空、展示选中的内容功能实现演示,设置复选框选中,检查复选框选中状态
jquery.validate添加只能输入英文的验证
代码如下: // 只能输入英文 jQuery.validator.addMethod("english", function(value, element) { var chrnum = /^([a-zA-Z]+)$/; return this.optional(element) || (chrnum.test(value)); }, "只能输入字母");
飞奔去旅行
2019/06/13
2.1K0
jquery获取checkbox是否选中
在使用jquery的过程中,发现了一个比较特别的属性,那就是 input标签的 checkbox的 是否选中状态
执笔记忆的空白
2020/12/25
2.9K0
html复选框选中与未选中触发事件的方法
今天,当制作一个不需要from表单的复选框来提交数据的小函数时,需要在复选框被选中或未选中的情况下修改一些后台数据。我想到了用js代码来监控复选框的状态,并将实时数据发送到后台。关于js代码如何监控checkbox的状态,可以参考下面的例子。
Power
2023/05/25
5.2K0
html复选框选中与未选中触发事件的方法
jQuery对输入框进行验证,只允许输入字母和数字
使用jQuery来对这两个输入框进行验证,确保只允许输入字母和数字,不允许输入中文字符。 以下是相应的示例代码:
王小婷
2023/09/19
4330
React技巧之检查复选框是否选中
原文链接:https://bobbyhadz.com/blog/react-check-if-checkbox-is-checked[1]
chuckQu
2022/08/19
1.5K0
React技巧之检查复选框是否选中
Jquery 判断 checked 是否选中
如果要判断Js中的 checked 是否选中,首先取决于你 引用 的 Jquery 的版本。
White feathe
2021/12/08
2.8K0
jquery关于checkbox选中和不选中的问题
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/148481.html原文链接:https://javaforall.cn
全栈程序员站长
2022/09/07
2K0
jquery操作select(取值,设置选中)
本文由 小马哥 创作,采用 知识共享署名4.0 国际许可协议进行许可 本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
IT小马哥
2023/04/07
3.9K0
checkbox选中和不选中 jqu_jquery怎么设置checkbox不选中?
1、设置不选中:$(“#my-checkbox”).prop(“checked”,false);
全栈程序员站长
2022/09/14
3.8K0
用jquery实现表单验证_jquery验证插件
功能强大的 jQuery 表单验证插件,适用于日常的 E-mail、电话号码、网址等验证及 Ajax 验证,除自身拥有丰富的验证规则外,还可以添加自定义的验证规则。
全栈程序员站长
2022/11/09
4.5K0
jquery 选中某一行
jquery 选中某一行 html: <div class="chatBox-list" ref="chatBoxlist"> <div class="chat-list-people"> <div><img src="img/icon01.png" alt="头像"/></div> <div class="chat-name"> <p>小明</p>
Dream城堡
2018/09/10
1.3K0
jquery操作select(取值,设置选中)
每一次操作select的时候,总是要出来翻一下资料,不如自己总结一下,以后就翻这里了。
全栈程序员站长
2022/07/11
3.5K0
点击加载更多

相似问题

Javascript :如果选中复选框,则必须填充验证输入

12

仅选中jquery复选框

40

jQuery验证-选中复选框时检查输入值

10

仅当选中复选框时才使用jquery验证字段

21

Yup -选中仅验证1复选框

250
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档