計算5bit數的2種演算法
有人在itpub上出了這麼一道題
5bit數: 二進位制中包含5個1的數,例如11111,1011011,100011101... 要求如下: 輸入任意十進位制a,b 引數, a<b,b<1000000000 (1)求出a,b 之間的最小5bit數 (2)求出a,b 之間所有5bit數的和 效能要求:輸入50組測試用例,總消耗時間不能超過3s
1.直接法
由網友solomon_007 最先回答。但他的寫法需要Oracle12才能支援,所以,把它改寫成一個函式+一個sql,並用了2個繫結變數。
create or replace function fn_10to2(p_num number) return varchar2 is l_str varchar2(32767):=null; n1 number; n2 number; begin n1 := p_num; loop n2 := mod(n1, 2); n1 := trunc(n1 / 2); l_str := to_char(n2) || l_str; exit when n1 = 0; end loop; return l_str; end fn_10to2; / var a number var b number exec :a:=10000 exec :b:=200000 SQL> with t as (select level n,fn_10to2(level)v from dual connect by level <=:b) 2 select min(n),sum(n) from t where regexp_count(v,'1')=5 and n between :a and :b; MIN(N) SUM(N) -------------------- -------------------- 10000 543234109 已用時間: 00: 00: 04.75
僅一個測試用例就不滿足時間要求了。
經過分析,以上演算法的問題出在太多的無效測試,假定範圍是0-31*2^5,最多有10個二進位制位,每個位都可能為0和1,因此剛好5位的數量大約佔1/10。另外9/10都是無效測試。
2.間接法
這種演算法先求長度為0-b的長度所有5bit數,然後計算那些落在a和b之間的數。這相當於在指定長度的位上求5個1的組合,而2進位制長度與數值是以2為底的對數關係。時間複雜度從O(n)降低為O(log n)。
SQL> with t as(select power(2,level-1)a from dual connect by level<=ceil(log(2,:b))) 2 ,r as(select a.a+b.a+c.a+d.a+e.a v 3 from t a,t b,t c,t d,t e 4 where a.a<b.a and b.a<c.a and c.a<d.a and d.a<e.a) 5 select min(v),sum(v) from r where v>=:a and v<=:b; MIN(V) SUM(V) -------------------- -------------------- 10000 543234109 已用時間: 00: 00: 00.07 SQL> exec :a:=0 PL/SQL 過程已成功完成。 已用時間: 00: 00: 00.03 SQL> exec :b:=1000000000 PL/SQL 過程已成功完成。 已用時間: 00: 00: 00.00 SQL> / MIN(V) SUM(V) -------------------- -------------------- 31 25476202472250 已用時間: 00: 00: 00.85
可見,演算法2比演算法1快,而且b越大,越明顯。
相關文章
- 計算2..n的素數
- 2.計算字元數字元
- 五種C語言非數值計算的常用經典排序演算法C語言排序演算法
- 9.3.2另一種計算機器2計算機
- 6-2 計算素數和
- 計算斐波那契數列的演算法演算法
- ORACLE 計算2個日期之間的天數Oracle
- Java中計算整數中唯一數字數量的3種方法Java
- 常見的三種排序演算法(選擇,冒泡,計數)排序演算法
- 計算機計算小數除法的陷阱計算機
- 2. 計算機怎麼表示數字計算機
- 看板數量的計算
- 你能不用計算機來計算S=a+(a+1)+(a+2) + ...... + b的解的數目嗎?計算機
- 2 - 到底哪種數倉設計模型更合適模型
- 雲端計算的多種類用途
- 計算機演算法計算機演算法
- 演算法計算字串的相似度演算法字串
- 計算2的N次冪n 可輸入,n為自然數
- 計算 FP8 (E5M2)所能表示的所有數
- 雲端計算支援 IT 安全的12種方式
- 計算檔案Checksum的幾種方法
- 雲端計算的7種變化方式
- 計算機演算法:資料壓縮之點陣圖(2)計算機演算法
- JS-計算日期差值;計算日期之間的月數JS
- 計算素數【Java】Java
- Octave 數值計算
- 計算機、數學、運籌學等領域的32個重要演算法計算機演算法
- OpenCV計算機視覺學習(2)——影像算術運算 & 掩膜mask操作(數值計算,影像融合,邊界填充)OpenCV計算機視覺
- 1011 數的計算
- 計算的簇數超過限制
- oracle計算表的記錄數Oracle
- 要種出數字之夢的土壤師:華為雲與計算BG是誰?
- 幾種計算機語言的評價計算機
- javascript計算指定數字的多少次方運算JavaScript
- 風控GPS的各種演算法引數演算法
- 【數值計算方法】線性方程組迭代演算法的Python實現演算法Python
- 用於計算數學統計的 PHP 包PHP
- 雲端計算要選擇什麼模式的呢?雲端計算又有幾種模式?模式