Mansory演算法分析

2021-09-06 16:17:46 字數 1045 閱讀 1663

相信大家對mansory排版演算法印象十分深刻,它能夠十分有效的實現頁面緊湊排版,節省空間,並且還顯得十分美觀。在很多**,包括鼎鼎有名的pinterest都使用了這個演算法來實現排版。這個過程有點象瓦匠在碼磚頭,所以我會有時候稱這些div為brick(磚頭),容器為牆面!

有乙個現象不知道大家注意否,這個排版的方法對於輸入是很敏感的。所謂的輸入就是指需要進行排版的div塊。進一步說對於不同的輸入,結果可能是大相逕庭的。這個不同可以從兩個方面來定義:第一,順序的不同;第二,大小的不同。這個只需要稍微思考下就可以明白的。不信的話大家可以做些試驗!

首先如果先不考慮細節的問題,正常邏輯應該是這樣實現:

1. 輸入為乙個陣列,也就是我們需要進行排版的div;

2. 中間進行對於這個陣列按順序遍歷,每次遍歷需要做一些工作(主要就是定位);

3. 輸出還是這個陣列,不過他們的位置都已經進行過從新定位了;

那麼在第二步,需要乙個placebrick方法來做碼磚頭的事情了。它的輸入其實就是每個磚頭。輸出就是碼好的磚頭。就這麼簡單!

具體步驟為拿到乙個brick

看牆面(容器)現在的高度(輪廓);

找到可以容納這個brick且不會和brick重疊,但又是最低處的牆面(位置)。

放置此brick,更新牆面(容器)狀態;

迭代這個過程,直到所有的brick用完;

其餘的20%可以留意看看它如何做resize重新計算以及新的brick如何載入上來的。都是基於理解上面的核心**的基礎上!

分析完了這個演算法以後,可以對這個演算法進行一些修改來為我所用。比如空隙這個問題,它十分依賴於輸入的順序和大小!

如果大小都是一樣,尤其是寬度一致的div應該是不會有這個問題的。對於排版來說要保證div寬度一致也是不可能的。經常會有各種寬度的div需要排版。那麼大小無法改變了,可以嘗試調換輸入的順序。不過這個邏輯會十分複雜。神人們可以嘗試一下!我屬於笨鳥,選者想辦法記錄下每個空格的位置,然後利用事先準備好的div來補上這些空隙!很直接的邏輯吧!具體實現過程可以參照下面截圖!注意這個方法必須緊接在每次更新牆面(容器)前!

然後基本上所有重要的事情就完成了。這樣你就可以達到下面的效果!

演算法分析 演算法的漸進效率分析

一般用於界定函式集合的上界,漸進表示式o g n 的含義就是,c為正常數,函式集合o中的元素的最大值不會超過c.g n f n o g n 的含義是,函式f n 的屬於集合o g n 因為函式集合o中的最大值為c.g n 所以f n 的最大值為c.g n 由於只是漸進的上界,所以當函式g n 的階數...

演算法和演算法分析

一 演算法的基本概述 演算法是為了解決某類問題而規定的乙個有限長的操作序列。乙個演算法必須滿足以下五個重要特性 1 有窮性2 確定性3 可行性 4 有輸入5 有輸出 二 設計演算法的原則 1.正確性 2.可讀性 3 健壯性 4.高效率與低儲存量需求 三 演算法的時間複雜度簡介 語句頻度 語句重複執行...

演算法和演算法分析

演算法是為了解決某類問題而規定的乙個有限長的操作序列。五個特性 1.有窮性2.確定性3.可行性4.輸入5.輸出 1.正確性2.可讀性3.健壯性4.高效性 1.問題規模和語句頻度 不考慮計算機的軟硬體等環境因素,影響演算法時間代價的最主要因素是問題規模。問題規模是演算法求解問題輸入量的多少,是問題大小...