第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為 N 個單元格的網格找到最佳行和列

為 N 個單元格的網格找到最佳行和列

holdtom 2023-03-10 13:48:29
我正在嘗試創(chuàng)建一個網格,該網格必須具有足夠的行和列以適應length單元格的數(shù)量。這里有些例子:- Length: 8: 2 rows x 4 cols - Length: 9: 3 rows x 3 cols - Length: 10: 5 rows x 2 cols - Length: 11: 4 rows x 3 cols (with one extra)我想出了一個解決方案,使用平方根,它給了我一個非常接近的解決方案:var cols = Math.ceil(Math.sqrt(length)); var rows = Math.ceil(length / cols);可以有額外的單元格(比如素數(shù)),但我更喜歡盡可能地減少它們。這種方法的問題是,當可能有更優(yōu)化的解決方案時,我得到的是空單元格:- Length: 8: returns 3 x 3, but 2 x 4 has 0 remainders - Length: 10: returns 4 x 3, but 5 x 2 has 0 remainders - Length: 15: returns 4 x 4, but 5 x 3 has 0 remainders有沒有其他方法可以優(yōu)化我的網格以獲得盡可能少的額外單元格?我覺得我的嘗試不是最佳的。
查看完整描述

2 回答

?
莫回無

TA貢獻1865條經驗 獲得超7個贊

對于偶數(shù) length m,我們可以很容易地說:


cols = m / 2

rows = 2

對于奇數(shù)長度m,我們需要分解m。幸運的是,只需要一個非平凡的(1 或m)因子就足夠了。通過以下算法:


for(var i = 3; i * i < m; i += 2){

    if(m % i == 0)

        return i;

}

return -1;

如果結果是-1,它將是質數(shù),因此,最終結果將是:


cols = (m+1)/2

rows = 2

否則,如果我們調用 factor k,結果將是:


cols = m / k

row = k

您可以在以下內容中找到最終結果:


function factor(m){

   // if m is even

   if(m % 2 == 0)

       return [2, m/2]   

   for(var i = 3; i * i < m; i += 2){

        // m is odd and not prim

        if(m % i == 0)

            return [i, m/i];

   }

   // m is odd prime

   return [2, (m+1)/2];


console.log(factor(8));

console.log(factor(10));

console.log(factor(11));

console.log(factor(15));

此功能的結果已優(yōu)化(根據(jù)您的定義)。因為余數(shù)對于非素數(shù)為零,而1對于素數(shù)則為零。



查看完整回答
反對 回復 2023-03-10
?
繁華開滿天機

TA貢獻1816條經驗 獲得超4個贊

假設這些數(shù)字永遠不會大到天文數(shù)字,您可以只檢查每個數(shù)字從平方根開始的擬合程度,并在給定評估函數(shù)的情況下跟蹤最佳數(shù)字,該評估函數(shù)既考慮了余數(shù)又考慮了方差。所以像:


function optimizeRectangle(N) {

  let bestRectangle = null;

  let best_evaluation = Infinity;


  let start_row = Math.floor(Math.sqrt(N));

  // Maximum aspect ratio of 3:1

  for (let offset = 0; offset < start_row / 2; offset++) {

    let row = start_row - offset;

    let col = Math.ceil(N/row);

    let remainder = row * col - N;

    let evaluation = remainder + offset; // or some other function of remainder and offset

    if (evaluation < best_evaluation) {

      best_evaluation = evaluation;

      best_rectangle = [row, col];

    }

  }

  return best_rectangle;

}

請注意,我實際上并沒有運行這段代碼,所以如果沒有運行,請將其視為偽代碼。


查看完整回答
反對 回復 2023-03-10
  • 2 回答
  • 0 關注
  • 128 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號