列表控件是数据显示时使用的一种常用的控件。

刚发现有网友把这个算法说得更清楚,推荐大家去它的博客看:https://www.jianshu.com/p/76827322f33f

下面是我提供的原始的版本 :)

一般情况下列表中的行是等高的,这种情况下无论列表包含多少行,都能够在O(1)的时间定位到指定行。

但是当显示的内容格式不一致时,使用相等的行高可能就意味着显示空间的浪费,也意味说用户需要更多的滚动操作,影响用户体验。

要实现一个支持可变行高的列表控件,首先要解决的问题就是快速定位列表行。

假定一个列表中的表项按照下面的高度排列:

1,2,3,1,2,3,1,2,3,1,2,3,4,5

可以知道总高度为:33

程序员需要解决从一个随机的[0,32]的值(x)定位到哪一行的问题。

当然最简单的办法就是从第一行开始逐行的数,直到数到的那一行正好包含x,可以知道这个算法的时间复杂度为O(n)。

当n很大时,这个算法基本上不可行。

一行一行的数显然是很浪费时间的,解决的办法就是一段一段的数。

要实现分段数,一个前提就是我们需要为这些数据提前建立好索引表。对于上面序列假定以3个元素一组为单位建立索引表就可以获得:(6),(6),(6),(6),(9),如此一来,要定位一行,我们最多需要数5+3次就能找到一行。

对于数据量比较少的情况,可能上述分组方法就能解决问题了。

但是对于数据量更大的情况如何处理呢?方法很简单,那就是分组再分组,直到最后所有的分组数据形成一棵索引树。树上每一个结点代表该结点下所有子节点的高度和。

通过构造索引树,无论多少数据量,都可以在O(log(n))的时间定位到任意行。

另外,对于大量数据,我们可能在初始化的时候并不知道总数有多少,而是在显示到哪一行时再通过计算获得。

对于这种情况,我们需要动态更新索引树。更新过程也很简单,当一行更新高度时,只需要找到该行所在的叶节点,更新叶节点高度,再逐级更新父节点即可,时间复杂度同样是O(log(n))。

具体实现可以参考SOUI的ListView中用于可变行高支持的类:SListViewItemLocatorFlex

一种高效的可变行高列表行定位算法相关推荐

  1. CSS 行高与行对齐精解:line-height 和 vertical-align (图文)

    7.3 line-height 行高指的是文本行的基线间的距离,但是文本之间的空白距离不仅仅是行高决定的, 同时也受字号的影响. 7.3.1 语 法 line-height属性的具体定义列表如下: 语 ...

  2. mysql workbench 行高_CSS行高——line-height

    初入前端的时候觉得CSS知道display.position.float就可以在布局上游刃有余了,随着以后工作问题层出不穷,才逐渐了解到CSS并不是几个style属性那么简单,最近看了一些关于行高的知 ...

  3. 0基础快速入门CSS技术栈(4)—图解详细阐述CSS的复合选择器、标签显示模式、行高、CSS背景,及最为重要的CSS三大特性附带权重计算笔试题(附详细案例源码解析过程)

    文章目录 1. 0基础快速入门CSS技术栈(4) 2. 重点提炼 3. CSS复合选择器 3.1 后代选择器(重点) 3.1.1 example01 3.2 子元素选择器 3.2.1 exmaple0 ...

  4. css行高line-height的用法

    一.line-height语法 line-height属性的具体定义列表如下: 语法: line-height : normal | <实数> | <长度> | <百分比 ...

  5. CSS基础-行高(height和line-height)【学习笔记】

    1 行高测量 行高的测量方法: 2 单行文本垂直居中 行高我们利用最多的一个地方是: 可以让单行文本在盒子中垂直居中对齐. 文字的行高等于盒子的高度. 这里情况些许复杂,开始学习,我们可以先从简单地方 ...

  6. CSS 行高 line-height属性

    在CSS中,通过 line-height属性来定义行高,行高是指相邻两行文本基线之间的垂直距离. 那什么是基线呢?对任何一个行内非替换元素,其内容区都会存在四条假想的线,分别是底线(bottom).基 ...

  7. html5设置单元格行高,单元格的行高怎么设置 EXCEL文档怎么统一设置行高

    我要把有几行设置为同样的高度,可是一行一行的拉,太慢了. 在Excel中,如何设置表格最合适的行高.列宽? EXCEL中的单元格行高不够怎么调整可以自动调整,根据字的内容来调整: 请问怎么统一设置EX ...

  8. excel表格怎么调整行高和列宽_wps表格课程08|调整行高列宽

    本课程由菜鸟在线教育独家出品,未经授权严禁用于商业用途,侵权必究 客服微信:13264012523 调整行高列宽是表格内容布局的必备技能. 方法/步骤 ■ 调整行高/列宽的最基础办法是:将鼠标定位到行 ...

  9. html table设置行高_单元格的行高怎么设置 html语言怎么设置设置表格行高?

    在Excel中,如何设置表格最合适的行高.列宽? 本次操作使用的软件为Excel电子表格,软件版本为office家庭和学生版2016. 小编只是难过不能陪你一起到老,再也没有机会,看到你的笑. 请问怎 ...

最新文章

  1. 网络编程试卷选择解析
  2. python语言表白源码-python七夕浪漫表白源码
  3. 蓝桥杯练习系统习题-基础训练
  4. Linux命令:dd、iostat、sar
  5. CF452F Permutations/Luogu2757 等差子序列 树状数组、Hash
  6. PPT到底是天使还是魔鬼?
  7. 2014年计算机初级应用考试是,2014年国硕士研究生入学统一考试计算机基础试题...
  8. Intel 64/x86_64/IA-32/x86处理器 - SIMD指令集 - SSE扩展(2) - SSE程序设计环境概述
  9. 理解思科IPS系统的traffic flow notifications
  10. linux 嵌入式串口通信,基于linux的嵌入式串口通信综述.doc
  11. mysql connections
  12. Python + vs +Opencv
  13. php+mysql事务处理例子详细分析实例
  14. Mac上的免费数据库可视化工具:Sequel Pro
  15. 【FPGA】基于VGA的图像显示
  16. Digester基本用法
  17. 其他笔记 - matlab代码转换为python代码(SMOP、numpy)
  18. python羊车门问题的正确解答
  19. c语言解矩阵方程ax=b,用初等变换的方法求解矩阵方程AX=B
  20. linux下启动tomcat----Cannot find ./catalina.sh

热门文章

  1. (0084)iOS开发之测试iOS远程消息推送
  2. Linux boot启动串口出现乱码,使用 am335x-evm-sdk-src-02.00.01.07 的源码,UBOOT阶段使用LCD控制器后,内核启动串口控制台输出乱码。...
  3. java如何保存初始化数据_java – 如何在JUnit测试中初始化数据
  4. 用电脑发短信_重磅!一个软件实现电脑上接打手机电话、收发短信、传文件、屏幕镜像!...
  5. django中判断当前user具有是否有对模块的增删改查权限
  6. Halcon中数据的四舍五入、取整、有效数字以及和字符串之间的转换
  7. Softmax 回归 vs. k 个二元分类器
  8. Codeforces 1036E. Covered Points
  9. c#获取DataTable某一列不重复的值,或者获取某一列的所有值
  10. 常见的音视频封装和编码