算法兵法全略(譯文)

目錄

始計篇

謀攻篇

軍形篇

兵勢篇

虛實篇

軍爭篇

九變篇

行軍篇

地形篇

九地篇

火攻篇

用間篇


始計篇

算法,在當今時代,猶如國家關鍵的戰略武器,也是處理各類事務的核心樞紐。算法的世界神秘且變化萬千,不夠賢能聰慧的人沒辦法掌控它,缺乏睿智的頭腦難以洞悉其中的精妙。所以,立志鉆研算法的人,一開始就得考察五件關鍵的事,通過仔細比對謀劃,來探尋其中的門道。

第一項是 “算力”,它是算法運行的硬件基礎。就好比電腦有著強大的芯片,運算速度快如迅猛的雷電,海量的數據可以毫無阻礙地流通處理,依靠這樣的算力,就能應對復雜艱難的運算任務。第二點是 “邏輯”,它如同行軍打仗時排布陣勢的規則紀律。各個環節緊密相連、條理清晰,能保證指令有條不紊,步驟清清楚楚,只要其中一個環節出錯,整個算法就沒辦法成功運行。“數據” 排在第三位,它就像是軍隊里的糧草與士兵。廣泛收集來自各個地方的信息,數據充足時,算法就如同插上豐滿的羽翼,能夠大展身手;要是數據匱乏,就算算法設計得再精妙,也沒辦法施展,就像手藝再好的主婦,沒米也做不出飯。“架構” 是第四關鍵要素,它是對算法進行整體規劃布局的精妙手段。有的架構設計得精巧細致,有的則氣勢恢宏,只有架構足夠穩固,才能承載算法里繁雜的各種細則,讓算法順利運作。最后要說 “應變” 能力,在形勢瞬息萬變的時候,算法要像靈動的水流一樣。一旦出現全新的、棘手的難題,能夠迅速改變策略、巧妙做出調整,不被固有的規則束縛住手腳。

這五件事,凡是鉆研算法的人沒有不知道的,深入了解它們的人才能取勝,不了解的必然失敗。所以要綜合比對考量,來摸清楚情況。要問問:算法有沒有創新的能力?具備高效的特質嗎?有足夠的兼容性嗎?能保持穩健運行嗎?擁有自我進化的本領嗎?主導者是否深明算法之道?開發者有沒有真才實干?是否順應了時代潮流與客觀環境?是否遵循相關的規則標準?算力資源夠不夠強?相關技術人員是否訓練有素?激勵與規范機制是否明晰合理?通過這些,就能預判算法應用的成敗了。

對比敵我雙方時,通常要考量七計:算法復雜度,我方比對方簡單,就能快速取勝;精準度方面,毫厘之差,往往就決定了成敗歸屬;適應性上,能夠駕馭復雜多變情況的,才是上佳之選;擴展性,具備拓展版圖的潛力,后續發展動力才源源不斷;安全性,壁壘森嚴,讓對手無法侵入;成本效益,投入與產出要權衡精妙;時效性,在瞬息萬變的局勢里,動作快的才能稱王。在決策前精心謀劃,謀定而后動,要是不做謀劃就盲目行動,必然陷入困境;多做謀劃的穩操勝券,謀劃少的危機四伏,毫無謀劃就只能徒自哀嘆。

還沒經過謀劃籌備,就盲目啟用算法,沒分析清楚利弊就倉促行動,必然遭遇失敗;先經過精密計算、周全權衡,謀劃妥當之后再施行算法,才能取得成功。考慮得越周全越容易取勝,考慮得少就難以成功,更何況那些完全不謀劃的呢?這就是算法開篇謀劃的要點,千萬不能忽視。

謀攻篇

上乘的算法,能夠做到不通過激烈戰斗就讓對手屈服。并非只靠蠻力強攻,而是憑借巧妙構思智取。要是能洞悉數據脈絡,摸透需求根源,只需一段代碼,就能解決諸多難題,免去冗余的運算,這就是所謂的 “全勝”。不了解對手也不了解自己,每次戰斗都必定失敗;知曉敵我雙方情況,勝算就穩穩在握。剖析對手算法的優劣之處,查漏補缺;自我反省己方算法的長短處,不斷磨礪提升。

戰例一:二分查找

來看一個簡單的二分查找算法代碼(Python),它用于在有序數組中快速定位元素:

二分查找算法,是在有序數組里尋找特定元素的一種高效方法。這個方法一開始選取數組的中間元素,拿它和要找的目標值作比較。要是中間元素剛好和目標值一樣,那查找就結束了,這是最理想的情況,此時的復雜度是O(1)

要是目標值比中間元素小,那就知道要找的元素肯定在數組左半部分,于是舍棄右半部分,只在左半部分接著查找;要是目標值比中間元素大,就明白要找的元素在數組右半部分,便扔掉左半部分,只在右半部分搜索。就像這樣反復操作,每一次比較差不多都能排除一半的候選元素,使得查找范圍依次縮小一半。

假設數組里元素的數量是n,查找過程就會像n,n/2,n/4,…… ,n/2? 這樣(k是比較的次數),一直到對n/2?取整之后結果是1 ,也就是讓n/2? = 1,由此能算出k = log?n 。所以二分查找算法的時間復雜度是O(log n)

說到空間復雜度,如果用循環的方式來實現這個算法,只需要常數級別的額外空間,不會隨著數據量的大小而改變,它的空間復雜度就是O(1);要是用遞歸的方式實現,遞歸的深度和次數都是log?n ,每次需要的輔助空間是常數級別的,所以空間復雜度就是O(log n)

def binary_search(arr, target):low, high = 0, len(arr) - 1while low <= high:mid = (low + high) // 2if arr[mid] == target:return midelif arr[mid] < target:low = mid + 1else:high = mid - 1return -1

運用算法展開攻勢時,要么單點突破,緊緊抓住核心關鍵,如同利刃直刺咽喉;要么迂回包抄,多路并行,把對手困在數據迷宮里;要么聯合借力,整合各方優勢,讓接口連通四面八方的智慧,構建起磅礴有力的算力聯軍,凝聚眾力去攻破堅固的壁壘。要忌諱分散零碎,力量匯聚起來才強大,攥緊手指成拳頭,砸向對手軟肋,一擊就能建立功勛 。

軍形篇

善于防守的算法,要藏住鋒芒,隱匿關鍵的邏輯。數據加密就如同高聳的鐵城,任憑對手窺探,也難以找到破綻,比如用 Python 的cryptography庫實現 AES 加密:

戰例二:Python 的cryptography庫實現 AES 加密

首先,在Fernet.generate_key()這里,這是生成密鑰的任務。它的復雜度大概是O(1),因為生成密鑰的方法,依靠既定的規則以及隨機數生成機制,所需要的時間和資源,和要處理的數據量沒有關系,都能在固定的時間內完成。

其次,創建Fernet對象cipher_suite,也就是執行Fernet(key)這一步操作,它的復雜度同樣是O(1)。因為只是把生成的密鑰當作參數傳進去,內部的初始化操作,大多是設置相關屬性,不涉及復雜的數據處理,不需要遍歷、計算大量的數據,所以很快就能完成。

至于message = b"Secret data",這是消息賦值的操作,可以看成是O(1)。這個操作僅僅是把字節數據存到變量里,不涉及繁瑣的計算,一下子就能完成。

最后,encrypted_message = cipher_suite.encrypt(message)是關鍵的加密操作。由于Fernet類的加密算法屬于對稱加密,雖然具體的實現細節有所隱藏,但通常這類加密操作,復雜度也是O(n),這里的n就是消息message的長度。因為在加密的時候,需要逐個遍歷消息的字節,對每個字節或者字節組進行相應的變換,比如置換、混淆這類操作,它的操作時間和消息長度是成正比的。不過,這種復雜度是線性的,所以在處理常規長度的消息時,仍然能夠高效完成,還能保證加密的安全性。

總的來說,這段代碼整體的算法復雜度,當消息長度是n的時候,是由關鍵的加密操作決定總體復雜度的,大概是O(n)。因為n通常比較小,而且各個步驟中常數時間的操作也很少,所以在實際使用的時候,它的性能很不錯,可以快速完成加密任務,讓數據能夠安全地存儲、傳輸。

from cryptography.fernet import Fernetkey = Fernet.generate_key()
cipher_suite = Fernet(key)
message = b"Secret data"
encrypted_message = cipher_suite.encrypt(message)

冗余備份就像是后備軍,無懼突發的數據損毀情況,韌性十足。善于進攻的算法,氣勢磅礴,鋒芒畢露,接口開放,大量吸納流量;運算高效,瞬間給出結果,讓對手措手不及。

首先要做到讓自己立于不敗之地,穩固自身根基,等到對手露出破綻,就順勢出擊。算力充沛、架構穩固,這就是不敗的根基;持續監測、動態優化,讓這種不敗姿態長久保持。看到有取勝機會也不輕易行動,積蓄力量等待時機;看不到取勝契機,就韜光養晦,修煉內功,等局勢變化,一朝奮發而起。

兵勢篇

算法的勢頭,猶如湍急洶涌的江流,奔騰不息。借助數據的浪潮涌動,驅動運算的漩渦,一波接著一波,層層累積優勢。迭代更新,就是這上漲的潮水之力,最初版本問世時,不過是涓涓細流,持續優化后,最終會成為澎湃的巨力,沖垮競品構筑的堤岸。

戰例三:機器學習的梯度下降算法,每進行一次迭代,就會朝著最優解更靠近一點。

這個gradient_descent函數,它的時間復雜度可以這樣來分析: 在開始的時候,m = len(x)和theta = np.zeros(2),這些都是簡單的操作,它們的復雜度是 O(1)。 核心部分呢,是for _ in range(num_iterations)這個循環,它的執行次數是由num_iterations決定的。 在這個循環里面:

  • prediction = np.dot(x, theta)這個操作是矩陣相乘,如果x是一個m x n的矩陣,那么這個操作的復雜度就是 O(mn)
  • error = prediction - y是向量相減,它的復雜度是 O(m)。?
  • gradient = np.dot(x.T, error) / m,這里面包含矩陣轉置、矩陣與向量相乘以及元素級的除法,其中起主導作用的復雜度是矩陣相乘的復雜度,所以是 O(mn)
  • theta -=?learning_rate * gradient是元素級的操作,復雜度是 O(n)

總體來說,因為在循環中矩陣相乘是最耗費時間的操作,并且這個循環會執行num_iterations次,所以整體的時間復雜度是 O(num_iterations x mn)

import numpy as np# 簡單梯度下降模擬
def gradient_descent(learning_rate, num_iterations, x, y):m = len(x)theta = np.zeros(2)for _ in range(num_iterations):prediction = np.dot(x, theta)error = prediction - ygradient = np.dot(x.T, error) / mtheta -= learning_rate * gradientreturn theta

營造有利態勢,激發算法的協同效應,各個模塊聯動起來,實現 1 + 1 遠遠大于 2 的效果。善于借助熱點潮流,乘著東風之勢,把算法嵌入熱門賽道,就像順水行舟,一日千里。隨機應變,對手一變我方變動更快,將算法的靈活性轉化成靈動敏捷的身姿,在浪潮中靈活穿梭,始終占據優勢地位。

虛實篇

算法的精妙之處,就在于虛實相互依存。向對手展示虛的一面,把關鍵信息藏在混沌迷霧里,模糊參數、隱匿流程,讓對手摸不著頭腦;進攻時拿出實的手段,握緊核心算法,精準打擊痛點。佯裝攻擊一處,誘使對手重兵防守,實際上卻暗度陳倉,劍指要害部位。

戰例四:隨機生成一些干擾數據,就像是“煙霧彈”,讓人難以分清真假。

這個generate_fake_data函數,作用是生成假數據。

函數一開始,定義了一個空列表fake_data,這個操作很快就能完成,復雜度是 O(1)

接著有一個for _ in range(size)的循環,循環的次數由傳入的參數size決定,一共會執行size次。在每一輪循環當中,value = random.randint(1, 100),這個生成隨機整數的操作,不管數據規模有多大,花費的時間都差不多是固定的,復雜度是 O(1);隨后執行fake_data.append(value),往列表里添加元素,這個操作同樣能在固定的時間內完成,復雜度也是 O(1)

綜合來看,循環會執行size次,每次循環里的操作復雜度都是 O(1),所以這個函數整體的時間復雜度就是 O(size)

import randomdef generate_fake_data(size):fake_data = []for _ in range(size):value = random.randint(1, 100)fake_data.append(value)return fake_data

制造數據假象,虛虛實實,迷惑對手的判斷。時而用海量模擬數據,混淆視聽;時而給出稀缺反饋,隱匿真實意圖。用虛來掩護實,以實來貼近虛,讓對手在虛實交錯之間迷失方向,自家算法則在悄無聲息間布局,等時機成熟,就雷霆萬鈞地出擊,直搗黃龍。

軍爭篇

在算法的競爭角逐中,要爭分奪秒。在數據傳輸這條賽道上,要快馬加鞭,削減延遲,搶占先機;在運算資源這個戰場上,要精打細算,合理調度,不浪費一絲一毫算力。迂回包抄走捷徑,緩存機制、預讀取技術,這些都是彎道超車的巧妙方法;直搗黃龍,最簡路徑算法能沖破冗余阻礙,迅速抵達目標。

戰例五:Python的`functools.lru_cache`,提供了便捷的緩存功能,能夠加快函數的執行速度。

有一個expensive_function函數,被functools.lru_cache(maxsize = 128)裝飾了。來詳細看看它的時間復雜度:

這個函數本身所做的事情,僅僅是計算n * n,這只是簡單的乘法運算,所花費的時間是固定的,所以復雜度應當是O(1)

再加上lru_cache裝飾器后,初次遇到某個n值來調用這個函數時,一定會先進入函數體,打印出“Calculating for {n}”這樣的內容,然后再執行乘法運算,這一系列操作,所花費的時間也不過是常數時間,復雜度是O(1)

要是之后又用相同的n值再次調用這個函數,因為有緩存,就可以直接從緩存里獲取結果,不用重新計算,耗費的時間幾乎可以忽略不計,復雜度近乎O(1)

假設調用頻率非常高,傳入的`n`值種類超過了maxsize的數值(這里是128),舊的緩存雖然會更替,但更替的方式,并不是遍歷全部緩存內容,僅僅涉及局部數據的整理,復雜度仍然在O(1)左右。

總而言之,當調用次數不是特別多,傳入的n值沒有超過緩存容量限制的時候,大部分調用都是從緩存里獲取數據,復雜度是O(1);就算有超出的情況,緩存的更替操作也不復雜,整體復雜度也接近O(1),只是初次遇到新值、緩存更替的時候,會有一點額外的操作,但對性能并沒有什么損害。

import functools@functools.lru_cache(maxsize=128)
def expensive_function(n):print(f"Calculating for {n}")return n * n

然而激進猛進也有風險,必須防范陷阱漏洞。在激烈競爭中,也不能忘了穩健運維,一邊沖鋒一邊整頓,通過代碼審查、風險預警,為算法高速前行保駕護航,穩穩收獲勝利果實。

九變篇

算法世界,局勢風云變幻,必須精通九變之術。市場風向突然轉變,需求一夜之間就更迭變化,算法不能墨守成規。要是算力受限,就應當舍棄繁雜,裁剪冗余部分;遇到數據畸變,要迅速校準模型,重新尋找規律的關鍵點。

戰例六:使用pandas處理數據

一開始,pd.read_csv讀取文件時,會遍歷文件的內容,所花費的時間取決于文件的行數,時間復雜度為O(n);接著,dropna函數剔除缺失值時,需要遍歷數據,其復雜度和數據規模相關,是O(m),不過整體的時間復雜度受讀取文件這一步的影響更大,大概是O(n)

import pandas as pddata = pd.read_csv('your_file.csv')
cleaned_data = data.dropna()

有的路不要去走,有的敵軍不要去攻擊,有的城池不要去攻打,有的地盤不要去爭奪。不是關鍵賽道,就別盲目投入算法資源;碰上難啃的硬骨頭,就暫時避開鋒芒,迂回包抄。靈活應變,不拘泥于固定模式,才能在算法江湖里游刃有余。

行軍篇

行軍布陣,算法也有章法。數據存儲就像是安營扎寨,要選好架構這塊 “風水寶地”,保障安全又高效;分布式運算好似分兵游擊作戰,各自為戰又能協同配合,掌控全局。監測代碼運行,就如同斥候巡邏,隱患剛一露頭,就能立刻察覺;調試糾錯,便是整飭軍紀,做到令行禁止,讓算法回歸正軌。

戰例七:使用Python的logging模塊記錄代碼的運行狀態。

這段代碼中的some_algorithm函數,其時間復雜度值得探究。首先,logging.info("Algorithm started")這個操作是將信息記錄到日志中,花費的時間非常短,不涉及復雜的運算,時間復雜度為O(1)

至于其中的“主算法邏輯”,由于沒有詳細展示,所以很難確定它的時間復雜度,有可能是O(1),比如只進行簡單的操作,像是賦值、比較等;也可能是O(n),要是存在遍歷相關的操作;還可能是O(n2),倘若包含嵌套循環;其他復雜度也有可能,都取決于具體的算法。

最后,logging.info("Algorithm finished")這個操作和前面一樣,時間復雜度為O(1)。 該函數的整體時間復雜度由“主算法邏輯”主導,然而因為這部分不明確,所以很難確切知曉,只知道前后記錄信息的操作都是常數復雜度,如果“主算法邏輯”的復雜度是C,那么這個函數整體的時間復雜度就是O(C),而C會因具體算法而異。

import logginglogging.basicConfig(level = logging.INFO)
def some_algorithm():logging.info("Algorithm started")# 主算法邏輯logging.info("Algorithm finished")

依據不同環境調適算法,面對不同硬件平臺、使用場景,算法都能精準適配,就像變色龍融入背景一樣,無縫對接,穩定又高效運行,這才是行軍不敗的方法。

地形篇

算法落地實施,必須審視所處地形。商業場景如同山地,高低起伏,競爭激烈的地方就是陡峭高峰,細分賽道則是隱蔽山谷,選準山谷深耕細作,避開高峰的鋒芒;科研領域好似曠野,廣闊無垠,適合大開腦洞,鋪展算法宏偉藍圖,探索未知邊界。

戰例八:假定要依據不同場景來選擇推薦算法:

這個select_recommendation_algorithm函數,把scenario當作參數。進入函數體后,首先進行條件判斷。

要是scenario的值是“ecommerce”,就會立刻返回“Collaborative Filtering Algorithm”,這種判斷與返回操作瞬間就能完成,時間復雜度是O(1)

要是scenario的值是“research_paper”,同樣會迅速返回“Content-based Recommendation Algorithm”,它的時間復雜度也是O(1)

要是以上情況都不匹配,就返回“Default Algorithm”,這個操作也能快速完成,復雜度為O(1)。 這個函數僅僅做條件判斷,不管輸入什么值,耗費的時間都是固定的,所以整個函數的時間復雜度是O(1)

def select_recommendation_algorithm(scenario):if scenario == "ecommerce":return "Collaborative Filtering Algorithm"elif scenario == "research_paper":return "Content-based Recommendation Algorithm"return "Default Algorithm"

要知曉難易程度,清楚危險與平易之處,復雜的數據結構就是荊棘叢生的沼澤,簡易任務則是平坦大道。因地制宜部署算法,在沼澤地里就用輕量敏捷的方法,在大道上就施展磅礴宏偉之術,算法自然能暢行無阻,建立功勛。

九地篇

生地、死地、絕地…… 在算法的征程里,會涉足各類不同 “九地”。剛進入新興領域,這是生地,要大膽開拓,搶占先機;深陷競品的圍剿,就是進入死地,需背水一戰,激發自身潛能;面臨技術瓶頸,便處于絕地,要破釜沉舟,創新突圍。

戰例九:在遇到技術瓶頸的時候,應當嘗試引入新的技術框架。下面所講的,就是一個導入新框架的簡單示例。

這段代碼的時間復雜度值得探究一番。一開始,在try語句塊里的import new_tech_framework,這一導入模塊的操作,它所耗費的時間取決于框架的加載方式。要是框架已經妥善安裝,并且沒有復雜的初始化流程,加載過程近乎瞬間就能完成,時間復雜度為O(1);要是需要大量調配資源、讀取多個文件,那復雜度或許會上升,暫時用O(t)來表示,這里的t與框架的復雜程度、體量大小相關。

后續使用新框架的邏輯,由于沒有詳細說明,假設其復雜度為O(u),這取決于具體的算法。 到了except部分,print語句僅僅輸出一條信息,操作很簡單,能夠在固定時間內完成,時間復雜度是O(1)

綜合來看,如果導入成功,復雜度主要受新框架使用邏輯的影響,大約是O(u);要是導入失敗,那也不過就是執行print語句的O(1)。因為導入是否成功并不明確,不過導入操作通常能快速完成,所以整體復雜度通常接近O(1),只有在導入流程極為繁雜的時候,才依據實際耗費的時間來確定。

try:import new_tech_framework# 使用新框架的代碼邏輯
except ImportError:print("Failed to import new framework, fallback plan activated")

算法團隊協同配合,攻堅時能齊心協力匯聚一處,分散時又能各自探索。深入用戶場景這塊 “重地”,珍視用戶反饋,依據這些重塑算法靈魂,不管處于何種境地,都能絕地逢生,所向披靡。

火攻篇

火攻,就是借助外力助力算法發起凌厲攻勢。輿論熱點好似烈火,算法貼合熱點進行優化,趁著熱度飆升,收獲滾滾流量;跨界合作仿若借風,引入外部算法模塊、數據資源,燃起創新大火,燒穿行業隔閡,拓展業務版圖。

戰例十:借助社交媒體的API來抓取熱點話題數據,以此輔助算法的優化。

現有一段程序,引入了tweepy庫,其目的在于借助社交媒體推特(Twitter)的API,獲取熱點話題數據,助力算法優化相關事宜。

首先要配置Twitter API,于是設定多個參數:consumer_key、consumer_secret、access_token以及access_token_secret,分別賦予專屬的字符值,這些參數是連通推特API的關鍵密鑰。

接著,使用OAuthHandler構建認證對象auth,把consumer_key與consumer_secret傳入其中,以此奠定認證的基礎;再運用`set_access_token`方法,補充完整權限信息,讓認證更加周全。

最后得到API對象api,通過調用api.trends_place(1),向推特API請求熱門話題數據。這是因為trends_place函數能夠依據傳入的地域代碼(此處代碼為1,通常代表特定的默認地區),抓取該地區當下的熱門趨勢。獲取到的數據,后續可以應用到算法當中,依據數據特性,既能夠為訓練集補充素材,也能作為策略調整的依據,促使算法貼合輿情熱點,達到更優的性能表現。

import tweepy# 配置Twitter API
consumer_key = "your_key"
consumer_secret = "your_secret"
access_token = "your_token"
access_token_secret = "your_secret_token"auth = tweepy.OAuthHandler(consumer_key, consumer_secret)
auth.set_access_token(access_token, access_token_secret)
api = tweepy.API(auth)trends = api.trends_place(1)  # 獲取熱門話題

然而火不能隨意放,一旦失控反噬,必然釀成大禍。要把控好倫理邊界,不涉及隱私侵權問題;防范數據濫用,避免算法失控。善于用火攻,能為算法霸業添磚加瓦,謹慎用猛火,才能保住算法的良好聲譽,長治久安。

用間篇

在算法的江湖里,諜影重重。安插 “數據間諜”,收集競品情報,窺探對手的更新迭代、參數奧秘;啟用 “用戶暗探”,深挖需求痛點,為算法優化找準靶點。逆向工程則是巧妙的反間手段,剖析對手代碼,學習對方長處,化為己用。

戰例十一:模擬一個簡單的網頁爬蟲,用來獲取競品的公開數據。

首先,引入requests與BeautifulSoup庫,它們是獲取和解析網頁數據的重要工具。 其次,將url設定為競品網頁的地址,稱作competitor_url。

接著,使用requests.get(url)發起請求,該操作會向設定好的url發送HTTP請求,獲取網頁的響應。這一操作花費的時間和網頁大小有關,如果把網頁大小設為n,那么它的復雜度大約是O(n)

獲取響應之后,提取response.content,這個操作能夠在固定時間內完成,復雜度是O(1)。 再用BeautifulSoup(response.content, 'html.parser')創建BeautifulSoup對象soup,并使用html.parser來解析響應內容。這個解析過程,需要遍歷網頁內容,拆解其結構,它的復雜度與網頁大小以及復雜程度相關,假設網頁結構復雜度是m,那么這部分的復雜度大約是O(m)

最后,可以憑借BeautifulSoup對象的各種方法,解析網頁并提取關鍵信息,其復雜度依據所提取信息的多少以及網頁結構來定,是O(k),這里的k與所提取信息的數量以及網頁結構相關。

總體而言,這段代碼的整體復雜度,受網頁大小與結構的制約,因為需要發起請求、解析內容以及提取信息,大致是O(n + m + k),不過在實際情況中,網絡狀況和服務器響應速度也會對其性能產生影響。

import requests
from bs4 import BeautifulSoupurl = "competitor_url"
response = requests.get(url)
soup = BeautifulSoup(response.content, 'html.parser')
# 解析網頁提取關鍵信息

不過間諜很難用好,稍有不慎,反而會被對手迷惑。要甄別情報真假,不被虛假數據誤導;嚴守己方機密,防范間諜泄密,讓自家算法核心堅如磐石,在無聲的暗戰中勝出,最終成就算法霸業。

(完)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/895507.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/895507.shtml
英文地址,請注明出處:http://en.pswp.cn/news/895507.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

開關電源實戰(一)寬范圍DC降壓模塊MP4560

系列文章目錄 文章目錄 系列文章目錄MP4560MP4560 3.8V 至 55V 的寬輸入范圍可滿足各種降壓應用 MOSFET只有250mΩ 輸出可調0.8V-52V SW:需要低VF肖特基二極管接地,而且要靠近引腳,高壓側開關的輸出。 EN:輸入使能,拉低到閾值以下關閉芯片,拉高或浮空啟動 COMP:Compens…

微軟AutoGen高級功能——Magentic-One

介紹 大家好&#xff0c;博主又來給大家分享知識了&#xff0c;這次給大家分享的內容是微軟AutoGen框架的高級功能Magentic-One。那么它是用來做什么的或它又是什么功能呢&#xff0c;我們直接進入正題。 Magentic-One Magnetic-One是一個通用型多智能體系統&#xff0c;用于…

DeepSeek是如何通過“蒸餾”技術打造自己的AI模型

1 引言&#xff1a; 最近&#xff0c;外媒對中國公司——DeepSeek進行了猛烈抨擊&#xff0c;指控其采用了所謂的“蒸餾”&#xff08;Distillation&#xff09;技術&#xff0c;涉嫌抄襲甚至作弊。那么&#xff0c;什么是“蒸餾”技術&#xff1f; 在人工智能領域&#xff0c;…

【廣州大學主辦,發表有保障 | IEEE出版,穩定EI檢索,往屆見刊后快至1個月檢索】第二屆電氣技術與自動化工程國際學術會議 (ETAE 2025)

第二屆電氣技術與自動化工程國際學術會議 (ETAE 2025) The 2nd International Conference on Electrical Technology and Automation Engineering 大會官網&#xff1a;http://www.icetae.com/【更多詳情】 會議時間&#xff1a;2025年4月25-27日 會議地點&#xff1a…

伯克利 CS61A 課堂筆記 08 —— Strings and Dictionaries

本系列為加州伯克利大學著名 Python 基礎課程 CS61A 的課堂筆記整理&#xff0c;全英文內容&#xff0c;文末附詞匯解釋。 目錄 01 Strings 字符串 Ⅰ Strings are An Abstraction. Ⅱ Strings Literals have Three Forms Ⅲ String are Sequences 02 Dictionaries 字典 …

基于 GEE 計算研究區年均地表溫度數據

目錄 1 代碼解析 2 完整代碼 3 運行結果 1 代碼解析 &#xff08;1&#xff09;定義研究區&#xff1a; // 研究區的范圍需要自己提前上傳 var dataset table;// 將研究區顯示在中心&#xff0c;后面的數字為縮放等級&#xff0c;范圍從1 - 24 Map.centerObject(dataset,…

docker compose快速部署kafka-connect集群

先部署kafka集群&#xff0c;啟動 參考&#xff1a;docker compose部署kafka集群-CSDN博客 創建timezone文件&#xff0c;內容填寫Asia/Shanghai 再部署kafka-connect集群 networks: net: external: true services: kafka-connect1: restart: always image:…

Hutool - BloomFilter:便捷的布隆過濾器實現

1. 布隆過濾器簡介 布隆過濾器&#xff08;Bloom Filter&#xff09;是一種空間效率極高的概率型數據結構&#xff0c;用于判斷一個元素是否存在于一個集合中。它的優點是空間效率和查詢時間都遠遠超過一般的算法&#xff0c;但缺點是有一定的誤判率&#xff0c;即判斷元素存在…

日常知識點之遺留問題梳理(定時器/時間輪定時器)

1&#xff1a;簡單基礎 定時器的核心知識點&#xff0c;對我來說就是獲取當前時間和設置回調函數。 簡單練習&#xff1a; ? c語言通過gettimeofday 獲取當前時間并進行處理 ? 回調函數的定義&#xff08;函數參數有必要適當存儲&#xff09; typedef void(Timerfunc)(vo…

Python + WhisperX:解鎖語音識別的高效新姿勢

大家好&#xff0c;我是烤鴨&#xff1a; 最近在嘗試做視頻的質量分析&#xff0c;打算利用asr針對聲音判斷是否有人聲&#xff0c;以及識別出來的文本進行進一步操作。asr看了幾個開源的&#xff0c;最終選擇了openai的whisper&#xff0c;后來發現性能不行&#xff0c;又換了…

$ npx electron-forge import 一直報權限問題 resource busy or locked,

jackLAPTOP-7DHDAAL0 MINGW64 /e/project/celetron-project/my-electron-app (master) $ npx electron-forge import > Checking your system > Checking git exists > Checking node version > Checking packageManager version √ Found node22.14.0 √ Found gi…

mapbox 從入門到精通 - 目錄

&#x1f468;??? 主頁&#xff1a; gis分享者 &#x1f468;??? 感謝各位大佬 點贊&#x1f44d; 收藏? 留言&#x1f4dd; 加關注?! &#x1f468;??? 收錄于專欄&#xff1a;mapbox 從入門到精通 文章目錄 一、&#x1f340;總目錄1.1 ?? mapbox基礎1.2 ??…

Kotlin 2.1.0 入門教程(十五)繼承、重寫、派生類初始化順序

繼承 所有類都有一個共同的超類 Any&#xff0c;對于沒有聲明超類型的類來說&#xff0c;Any 是其默認的超類&#xff1a; // 隱式繼承自 Any。 class ExampleAny 有三個方法&#xff1a;equals()、hashCode() 和 toString()。因此&#xff0c;所有類都定義了這些方法。 默認…

sqlilabs--小實驗

一、先盲注判斷 ?id1 and sleep(2)-- 如果發現頁面存在注點&#xff0c;使用時間盲注腳本進行注入 import requestsdef inject_database(url):name for i in range(1, 20): # 假設數據庫名稱長度不超過20low 48 # 0high 122 # zmiddle (low high) // 2while low &l…

【數字】異步FIFO面試的幾個小問題與跨時鐘域時序約束

入門數字設計的時候&#xff0c;跨時鐘域的數據處理是繞不開的課題&#xff0c;特別是多比特數據跨時鐘域時&#xff0c;都會采用異步FIFO的方法。 異步FIFO中涉及較多的考點這里記錄幾個以供大家參考。 1. 異步FIFO的空滿判斷分別在哪個域&#xff1f; 根據異步FIFO的結構&…

淺談Java Spring Boot 框架分析和理解

Spring Boot是一個簡化Spring開發的框架&#xff0c;它遵循“約定優于配置”的原則&#xff0c;通過內嵌的Tomcat、Jetty或Undertow等容器&#xff0c;使得開發者能夠快速構建獨立運行的、生產級別的基于Spring框架的應用程序。Spring Boot包含了大量的自動配置功能&#xff0c…

算法06-回溯算法

一、回溯算法詳解 回溯算法是一種通過逐步構建解決方案來解決問題的算法。它通常用于解決組合問題、排列問題、子集問題等。回溯算法的核心思想是“試錯”&#xff0c;即在每一步嘗試所有可能的選項&#xff0c;如果發現當前選擇無法達到目標&#xff0c;就回退到上一步&#…

RabbitMQ學習—day2—安裝

目錄 普通Linux安裝 安裝RabbitMQ 1、下載 2、安裝 3. Web管理界面及授權操作 Docker 安裝 強力推薦學docker&#xff0c;使用docker安裝 普通Linux安裝 安裝RabbitMQ 1、下載 官網下載地址&#xff1a;https://www.rabbitmq.com/download.html(opens new window) 這…

降本增效 - VGF 構建輕量高性能日志管理平臺

VFG 技術架構 Filebeat 接收Syslog &#xff0c;并進行日志分段&#xff0c;VictoriaLogs 持久化存儲日志 &#xff0c;Grafana 可視化、數據查詢、告警、數據導出。 為什么要用VictoriaLogs &#xff1f; 與Elasticsearch /Grafana Loki相比幾十倍的CPU/內存/存儲資源占用的…

初識camel智能體(一)

同目錄下配置環境變量.env&#xff0c;內容如下&#xff0c; apikey從魔搭社區獲取 QWEN_API_KEY4ff3ac8f-aebc******** 先上干貨代碼&#xff0c;主代碼如下&#xff1a; from colorama import Forefrom camel.societies import RolePlaying from camel.utils import prin…