2013-06-22 53 views
2

我有一個網站有2個容器,每個容器都有一堆相關的內容。什麼樣的內容在什麼樣的容器中的組織是重要的,但不像容器儘可能靠近高度那麼重要。按容器高度組織容器內容

代碼:

<button>Click to add more boxes</button> 
<div id="wrapper" align="center"> 
    <div id="container1"> 
     <div class="box"></div> 
     <div class="box"></div> 
     <div class="box"></div> 
    </div> 
    <div id="container2"> 
     <div class="box"></div> 
     <div class="box"></div> 
     <div class="box"></div> 
     <div class="box"></div> 
    </div> 
</div> 

Jsfiddle


問:

增加更多的物品後,您將看到的,只是有時會在一個容器具有比其他顯著更多內容,但它確實發生。

發生這種情況時,我想將剩餘的物品放在較大的容器中,並將它們分配到容器中,使每個容器的高度儘可能接近彼此。

我該怎麼做呢?

+0

+1了有趣的問題。 – sachinjain024

回答

0

有一個標準算法Subset Sum Problem解決這個問題。

問題說

You have n integers. Divide n integers into two sets such that |Set1| - |Set2| is minimum. where |Set(i)| represents the sum of elements in ith set. 

我看你在這裏有一個類似的問題。假設你的容器是兩個集合,每個盒子的高度是一個整數,它將被放入該集合中。問題是我們必須以兩個容器的高度保持最小的方式來劃分整數(盒子)。

相關鏈接:

Subset Sum Problem - Wiki

Geeks for Geeks tutorial - 好的

+0

這不是我想要做的。我不想重新排列整個事物以儘量減少高度......這將更容易將我的頭圍繞並編碼......我想要檢測何時一個顯着更大,然後將更多元素放在更大容器,並以容器儘可能接近的方式拆分它們......這有意義嗎? –

+0

@RyanSaxe是的,我同意你的問題,但是這個決定哪些方框需要移動以平衡高度差,必須採用這個算法來找出哪些方框應該移動。我在我的下一個答案中提出了一個貪婪的(簡單的解決方案),這似乎是好的,但不是最好的。 – sachinjain024

+0

我不認爲你明白...允許移動的唯一盒子是那些使較大的容器太大的盒子 –

0

我已經發布了理想的算法,其中用使用。仍然可以做一些粗略的計算來看清楚容器。

Try this bin

JS代碼

var $container1 = $('#container1'); 
var $container2 = $('#container2'); 
$('.box').each(function(){ 
    $(this).height(100 * Math.random()); 
}); 
var move = $container1.outerWidth(); 
$container2.css("margin-left",move + 10); 

// Let us try to minimize the height difference 
var h1 = $container1.height(); 
var h2 = $container2.height(); 
var diff = 20; 

var currentDiff = h1-h2; 
if (currentDiff > diff) { 
    alert('1 is bigger than 2'); 
    reArrange($container1, $container2, Math.abs(currentDiff), diff); 
} 
if (currentDiff < -diff) { 
    alert('2nd is bigger than 1st'); 
    reArrange($container2, $container1, Math.abs(currentDiff), diff); 
} 

// Logic: Send the minium height box to smaller container 
function reArrange(largeC, smallC, currentDiff, diff) { 
    var minHeightBox = null; 
    var minH = 10000000000; 

    $('.box', largeC).each(function(){ 
     if ($(this).height() < minH) 
     minHeightBox = this; 
     minH = $(this).height(); 
    }); 

    // If transfering this to other reduces the difference, transfer this otherwise returh false 
    if (minHeightBox !== null) { 
    var newDiff = (largeC.height() - minH) - (smallC.height() + minH); 
    newDiff = Math.abs(newDiff); 
    console.log(newDiff); 
    if (newDiff < currentDiff) { 
     smallC.append(minHeightBox); 
     currentDiff = largeC.height() - smallC.height();  
     //Recursively call the method 
     if (currentDiff > diff) 
     reArrange(largeC, smallC, currentDiff, diff); 
    } 
    } 
} 
+0

總比沒有好,但它絕對不是事情。你說這是在作品中,雖然...另外,我可以用一個解釋,說明你是如何在超過極限的元素上運行它的,因爲我找不到它在哪裏 –

+0

@RyanSaxe你可以罰款通過調整代碼中diff的值來調整差異。看看這個http://jsbin.com/upacip/3/edit 當然,它不會做事情的確切事件,因爲我已經使用貪婪的方法,我已經提到了一個標準的方法,你應該遵循,如果你想最好。 – sachinjain024