一種高效的可變行高列表行定位演算法

2021-09-07 01:38:00 字數 942 閱讀 5195

列表控制項是資料顯示時使用的一種常用的控制項。

剛發現有網友把這個演算法說得更清楚,推薦大家去它的部落格看:

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

一般情況下列表中的行是等高的,這種情況下無論列表包含多少行,都能夠在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))。

Table標題行凍結,資料行滾動的一種方式

這段時間在做table標題行凍結,資料行滾動,雖然能實現,但也遇到一些問題,記錄下來。首先說說實現,實現其實不難,估計很多人都能想象出來,那就是標題行與內容行分離。我是這麼做的,用兩個 乙個只有thead,乙個只有tbody,兩個 的列數量是完全相等的,而且相同的列寬度完全相等。這樣兩個 合併在一起...

區塊鏈是一種用一種不可變的形式儲存數字資訊

鏈客,有問必答!從本質上來說,區塊鏈只是一種用不可變的形式來儲存數字資訊的方法。從企業的 it 戰略層面上來說,區塊鏈在概念上與關聯式資料庫很類似。大約三十多年前,關聯式資料庫取代了大型機 又叫非關係型資料庫 的主導地位。區塊鏈中的 區塊 用密碼鏈結在一起,這樣就不可能再通過修改以前的資料來 做假賬...

區塊鏈是一種用一種不可變的形式儲存數字資訊

鏈客,有問必答!從本質上來說,區塊鏈只是一種用不可變的形式來儲存數字資訊的方法。從企業的 it 戰略層面上來說,區塊鏈在概念上與關聯式資料庫很類似。大約三十多年前,關聯式資料庫取代了大型機 又叫非關係型資料庫 的主導地位。區塊鏈中的 區塊 用密碼鏈結在一起,這樣就不可能再通過修改以前的資料來 做假賬...