电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

如何用JavaScript學習算法復雜度

瀏覽:5日期:2023-06-05 10:34:20
概述

在本文中,我們將探討 “二次方” 和 “n log(n)” 等術語在算法中的含義。

在后面的例子中,我將引用這兩個數組,一個包含 5 個元素,另一個包含 50 個元素。我還會用到JavaScript中方便的performance API來衡量執行時間的差異。

const smArr = [5, 3, 2, 35, 2];const bigArr = [5, 3, 2, 35, 2, 5, 3, 2, 35, 2, 5, 3, 2, 35, 2, 5, 3, 2, 35, 2, 5, 3, 2, 35, 2, 5, 3, 2, 35, 2, 5, 3, 2, 35, 2, 5, 3, 2, 35, 2, 5, 3, 2, 35, 2, 5, 3, 2, 35, 2];什么是 Big O 符號?

Big O 表示法是用來表示隨著數據集的增加,計算任務難度總體增長的一種方式。盡管還有其他表示法,但通常 big O 表示法是最常用的,因為它著眼于最壞的情況,更容易量化和考慮。最壞的情況意味著完成任務需要最多的操作次數;如果你在一秒鐘內就能恢復打亂魔方,那么你只擰了一圈的話,不能說自己是做得最好的。

當你進一步了解算法時,就會發現這非常有用,因為在理解這種關系的同時去編寫代碼,就能知道時間都花在了什么地方。

當你了解更多有關 Big O 表示法的信息時,可能會看到下圖中不同的變化。我們希望將復雜度保持在盡可能低的水平,最好避免超過 O(n)。

如何用JavaScript學習算法復雜度

O(1)

這是理想的情況,無論有多少個項目,不管是一個還是一百萬個,完成的時間量都將保持不變。執行單個操作的大多數操作都是 O(1)。把數據寫到數組、在特定索引處獲取項目、添加子元素等都將會花費相同的時間量,這與數組的長度無關。

const a1 = performance.now();smArr.push(27);const a2 = performance.now();console.log(`Time: ${a2 - a1}`); // Less than 1 Millisecondconst b1 = performance.now();bigArr.push(27);const b2 = performance.now();console.log(`Time: ${b2 - b1}`); // Less than 1 MillisecondO(n)

在默認情況下,所有的循環都是線性增長的,因為數據的大小和完成的時間之間存在一對一的關系。所以如果你有 1,000 個數組項,將會花費的 1,000 倍時間。

const a1 = performance.now();smArr.forEach(item => console.log(item));const a2 = performance.now();console.log(`Time: ${a2 - a1}`); // 3 Millisecondsconst b1 = performance.now();bigArr.forEach(item => console.log(item));const b2 = performance.now();console.log(`Time: ${b2 - b1}`); // 13 MillisecondsO(n^2)

指數增長是一個陷阱,我們都掉進去過。你是否需要為數組中的每個項目找到匹配對?將循環放入循環中是一種很好的方式,可以把 1000 個項目的數組變成一百萬個操作搜索,這將會使你的瀏覽器失去響應。與使用雙重嵌套循環進行一百萬次操作相比,最好在兩個單獨的循環中進行 2,000 次操作。

const a1 = performance.now();smArr.forEach(() => { arr2.forEach(item => console.log(item));});const a2 = performance.now();console.log(`Time: ${a2 - a1}`); // 8 Millisecondsconst b1 = performance.now();bigArr.forEach(() => { arr2.forEach(item => console.log(item));});const b2 = performance.now();console.log(`Time: ${b2 - b1}`); // 307 MillisecondsO(log n)

我認為關于對數增長最好的比喻,是想象在字典中查找像 “notation” 之類的單詞。你不會在一個詞條一個詞條的去進行搜索,而是先找到 “N” 這一部分,然后是 “OPQ” 這一頁,然后按字母順序搜索列表直到找到匹配項。

通過這種“分而治之”的方法,找到某些內容的時間仍然會因字典的大小而改變,但遠不及 O(n) 。因為它會在不查看大部分數據的情況下逐步搜索更具體的部分,所以搜索一千個項目可能需要少于 10 個操作,而一百萬個項目可能需要少于 20 個操作,這使你的效率最大化。

在這個例子中,我們可以做一個簡單的快速排序。

const sort = arr => { if (arr.length < 2) return arr; let pivot = arr[0]; let left = []; let right = []; for (let i = 1, total = arr.length; i < total; i++) { if (arr[i] < pivot) left.push(arr[i]); else right.push(arr[i]); }; return [ ...sort(left), pivot, ...sort(right) ];};sort(smArr); // 0 Millisecondssort(bigArr); // 1 MillisecondO(n!)

最糟糕的一種可能性是析因增長。最經典的例子就是旅行的推銷員問題。如果你要在很多距離不同的城市之間旅行,如何找到在所有城市之間返回起點的最短路線?暴力方法將是檢查每個城市之間所有可能的路線距離,這是一個階乘并且很快就會失控。

由于這個問題很快會變得非常復雜,因此我們將通過簡短的遞歸函數演示這種復雜性。這個函數會將一個數字去乘以函數自己,然后將數字減去1。階乘中的每個數字都會這樣計算,直到為 0,并且每個遞歸層都會把其乘積添加到原始數字中。

階乘只是從 1 開始直至該數字的乘積。那么6!是1x2x3x4x5x6 = 720。

const factorial = n => { let num = n; if (n === 0) return 1 for (let i = 0; i < n; i++) { num = n * factorial(n - 1); }; return num;};factorial(1); // 2 Millisecondsfactorial(5); // 3 Millisecondsfactorial(10); // 85 Millisecondsfactorial(12); // 11,942 Milliseconds

我原本打算顯示factorial(15),但是 12 以上的值都太多,并且使頁面崩潰了,這也證明了為什么需要避免這種情況。

結束語

我們需要編寫高性能的代碼似乎是一個不爭得事實,但是我敢肯定,幾乎每個開發人員都創建過至少兩重甚至三重嵌套循環,因為“它確實有效”。Big O 表示法在表達和考慮復雜性方面是非常必要的,這是我們從未有過的方式。

以上就是如何用JavaScript學習算法復雜度的詳細內容,更多關于JS算法復雜度的資料請關注好吧啦網其它相關文章!

標簽: JavaScript
相關文章:
主站蜘蛛池模板: 超声波破碎仪-均质乳化机(供应杭州,上海,北京,广州,深圳,成都等地)-上海沪析实业有限公司 | 吲哚菁绿衍生物-酶底物法大肠菌群检测试剂-北京和信同通科技发展有限公司 | 楼承板-钢筋楼承板-闭口楼承板-无锡优贝斯楼承板厂 | 茶楼装修设计_茶馆室内设计效果图_云臻轩茶楼装饰公司 | 真空搅拌机-行星搅拌机-双行星动力混合机-广州市番禺区源创化工设备厂 | 环境模拟实验室_液体-气体控温机_气体控温箱_无锡双润冷却科技有限公司 | 吸污车_吸粪车_抽粪车_电动三轮吸粪车_真空吸污车_高压清洗吸污车-远大汽车制造有限公司 | 破碎机锤头_合金耐磨锤头_郑州宇耐机械工程技术有限公司 | 菏泽商标注册_菏泽版权登记_商标申请代理_菏泽商标注册去哪里 | STRO|DTRO-STRO反渗透膜(科普)_碟滤 | 台湾阳明固态继电器-奥托尼克斯光电传感器-接近开关-温控器-光纤传感器-编码器一级代理商江苏用之宜电气 | 天津试验仪器-电液伺服万能材料试验机,恒温恒湿标准养护箱,水泥恒应力压力试验机-天津鑫高伟业科技有限公司 | 桁架楼承板-钢筋桁架楼承板-江苏众力达钢筋楼承板厂 | 造价工程师网,考试时间查询,报名入口信息-网站首页 | 带锯机|木工带锯机圆木推台锯|跑车带锯机|河北茂业机械制造有限公司| | 不锈钢复合板厂家_钛钢复合板批发_铜铝复合板供应-威海泓方金属复合材料股份有限公司 | 理化生实验室设备,吊装实验室设备,顶装实验室设备,实验室成套设备厂家,校园功能室设备,智慧书法教室方案 - 东莞市惠森教学设备有限公司 | 三效蒸发器_多效蒸发器价格_四效三效蒸发器厂家-青岛康景辉 | Safety light curtain|Belt Sway Switches|Pull Rope Switch|ultrasonic flaw detector-Shandong Zhuoxin Machinery Co., Ltd | 探伤仪,漆膜厚度测试仪,轮胎花纹深度尺厂家-淄博创宇电子 | 石家庄救护车出租_重症转院_跨省跨境医疗转送_活动赛事医疗保障_康复出院_放弃治疗_腾康26年医疗护送转诊团队 | 桂林腻子粉_内墙外墙抗裂砂浆腻子粉推荐广西鑫达涂料厂家供应 | 电机铸铝配件_汽车压铸铝合金件_发动机压铸件_青岛颖圣赫机械有限公司 | 蒸压釜_蒸养釜_蒸压釜厂家-山东鑫泰鑫智能装备有限公司 | 真空搅拌机-行星搅拌机-双行星动力混合机-广州市番禺区源创化工设备厂 | 百度爱采购运营研究社社群-店铺托管-爱采购代运营-良言多米网络公司 | 电镀电源整流器_高频电解电源_单脉双脉冲电源 - 东阳市旭东电子科技 | 品牌广告服务平台,好排名,好流量,好生意。 | 高精度-恒温冷水机-螺杆式冰水机-蒸发冷冷水机-北京蓝海神骏科技有限公司 | 无锡装修装潢公司,口碑好的装饰装修公司-无锡索美装饰设计工程有限公司 | 撕碎机_轮胎破碎机_粉碎机_回收生产线厂家_东莞华达机械有限公司 | 广东恩亿梯电源有限公司【官网】_UPS不间断电源|EPS应急电源|模块化机房|电动汽车充电桩_UPS电源厂家(恩亿梯UPS电源,UPS不间断电源,不间断电源UPS) | 全自动包装秤_全自动上袋机_全自动套袋机_高位码垛机_全自动包装码垛系统生产线-三维汉界机器(山东)股份有限公司 | 光纤测温-荧光光纤测温系统-福州华光天锐光电科技有限公司 | 伶俐嫂培训学校_月嫂培训班在哪里报名学费是多少_月嫂免费政府培训中心推荐 | 石磨面粉机|石磨面粉机械|石磨面粉机组|石磨面粉成套设备-河南成立粮油机械有限公司 | 单柱拉力机-橡胶冲片机-哑铃裁刀-江都轩宇试验机械厂 | 哈希PC1R1A,哈希CA9300,哈希SC4500-上海鑫嵩实业有限公司 | LED灯杆屏_LED广告机_户外LED广告机_智慧灯杆_智慧路灯-太龙智显科技(深圳)有限公司 | 定制液氮罐_小型气相液氮罐_自增压液氮罐_班德液氮罐厂家 | 高铝矾土熟料_细粉_骨料_消失模_铸造用铝矾土_铝酸钙粉—嵩峰厂家 |