列表控制項是資料顯示時使用的一種常用的控制項。
剛發現有網友把這個演算法說得更清楚,推薦大家去它的部落格看:
下面是我提供的原始的版本 :)
一般情況下列表中的行是等高的,這種情況下無論列表包含多少行,都能夠在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 戰略層面上來說,區塊鏈在概念上與關聯式資料庫很類似。大約三十多年前,關聯式資料庫取代了大型機 又叫非關係型資料庫 的主導地位。區塊鏈中的 區塊 用密碼鏈結在一起,這樣就不可能再通過修改以前的資料來 做假賬...