一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

關(guān)于回溯算法的介紹與運(yùn)用

算法與數(shù)據(jù)結(jié)構(gòu) ? 來(lái)源:CSDN技術(shù)社區(qū) ? 作者:labuladong ? 2021-03-25 13:42 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

之前說(shuō)過(guò)回溯算法是筆試中最好用的算法,只要你沒(méi)什么思路,就用回溯算法暴力求解,即便不能通過(guò)所有測(cè)試用例,多少能過(guò)一點(diǎn)。

回溯算法的技巧也不難,前文 回溯算法框架套路 說(shuō)過(guò),回溯算法就是窮舉一棵決策樹(shù)的過(guò)程,只要在遞歸之前「做選擇」,在遞歸之后「撤銷選擇」就行了。

但是,就算暴力窮舉,不同的思路也有優(yōu)劣之分。

本文就來(lái)看一道非常經(jīng)典的回溯算法問(wèn)題,子集劃分問(wèn)題,可以幫你更深刻理解回溯算法的思維,得心應(yīng)手地寫(xiě)出回溯函數(shù)。

題目非常簡(jiǎn)單:

給你輸入一個(gè)數(shù)組nums和一個(gè)正整數(shù)k,請(qǐng)你判斷nums是否能夠被平分為元素和相同的k個(gè)子集。

函數(shù)簽名如下:

boolean canPartitionKSubsets(int[] nums, int k);

我們之前 背包問(wèn)題之子集劃分 寫(xiě)過(guò)一次子集劃分問(wèn)題,不過(guò)那道題只需要我們把集合劃分成兩個(gè)相等的集合,可以轉(zhuǎn)化成背包問(wèn)題用動(dòng)態(tài)規(guī)劃技巧解決。

但是如果劃分成多個(gè)相等的集合,解法一般只能通過(guò)暴力窮舉,時(shí)間復(fù)雜度爆表,是練習(xí)回溯算法和遞歸思維的好機(jī)會(huì)。

一、思路分析

把裝有n個(gè)數(shù)字的數(shù)組nums分成k個(gè)和相同的集合,你可以想象將n個(gè)數(shù)字分配到k個(gè)「桶」里,最后這k個(gè)「桶」里的數(shù)字之和要相同。

前文 回溯算法框架套路 說(shuō)過(guò),回溯算法的關(guān)鍵在哪里?

關(guān)鍵是要知道怎么「做選擇」,這樣才能利用遞歸函數(shù)進(jìn)行窮舉。

那么回想我們這個(gè)問(wèn)題,將n個(gè)數(shù)字分配到k個(gè)桶里,我們可以有兩種視角:

視角一,如果我們切換到這n個(gè)數(shù)字的視角,每個(gè)數(shù)字都要選擇進(jìn)入到k個(gè)桶中的某一個(gè)。

視角二,如果我們切換到這k個(gè)桶的視角,對(duì)于每個(gè)桶,都要遍歷nums中的n個(gè)數(shù)字,然后選擇是否將當(dāng)前遍歷到的數(shù)字裝進(jìn)自己這個(gè)桶里。

你可能問(wèn),這兩種視角有什么不同?

用不同的視角進(jìn)行窮舉,雖然結(jié)果相同,但是解法代碼的邏輯完全不同;對(duì)比不同的窮舉視角,可以幫你更深刻地理解回溯算法,我們慢慢道來(lái)。

二、以數(shù)字的視角

用 for 循環(huán)迭代遍歷nums數(shù)組大家肯定都會(huì):

for (int index = 0; index 《 nums.length; index++) {

System.out.println(nums[index]);

}

遞歸遍歷數(shù)組你會(huì)不會(huì)?其實(shí)也很簡(jiǎn)單:

void traverse(int[] nums, int index) {

if (index == nums.length) {

return;

}

System.out.println(nums[index]);

traverse(nums, index + 1);

}

只要調(diào)用traverse(nums, 0),和 for 循環(huán)的效果是完全一樣的。

那么回到這道題,以數(shù)字的視角,選擇k個(gè)桶,用 for 循環(huán)寫(xiě)出來(lái)是下面這樣:

// k 個(gè)桶(集合),記錄每個(gè)桶裝的數(shù)字之和

int[] bucket = new int[k];

// 窮舉 nums 中的每個(gè)數(shù)字

for (int index = 0; index 《 nums.length; index++) {

// 窮舉每個(gè)桶

for (int i = 0; i 《 k; i++) {

// nums[index] 選擇是否要進(jìn)入第 i 個(gè)桶

// 。..

}

}

如果改成遞歸的形式,就是下面這段代碼邏輯:

// k 個(gè)桶(集合),記錄每個(gè)桶裝的數(shù)字之和

int[] bucket = new int[k];

// 窮舉 nums 中的每個(gè)數(shù)字

void backtrack(int[] nums, int index) {

// base case

if (index == nums.length) {

return;

}

// 窮舉每個(gè)桶

for (int i = 0; i 《 bucket.length; i++) {

// 選擇裝進(jìn)第 i 個(gè)桶

bucket[i] += nums[index];

// 遞歸窮舉下一個(gè)數(shù)字的選擇

backtrack(nums, index + 1);

// 撤銷選擇

bucket[i] -= nums[index];

}

}

雖然上述代碼僅僅是窮舉邏輯,還不能解決我們的問(wèn)題,但是只要略加完善即可:

// 主函數(shù)

public boolean canPartitionKSubsets(int[] nums, int k) {

// 排除一些基本情況

if (k 》 nums.length) return false;

int sum = 0;

for (int v : nums) sum += v;

if (sum % k != 0) return false;

// k 個(gè)桶(集合),記錄每個(gè)桶裝的數(shù)字之和

int[] bucket = new int[k];

// 理論上每個(gè)桶(集合)中數(shù)字的和

int target = sum / k;

// 窮舉,看看 nums 是否能劃分成 k 個(gè)和為 target 的子集

return backtrack(nums, 0, bucket, target);

}

// 遞歸窮舉 nums 中的每個(gè)數(shù)字

boolean backtrack(

int[] nums, int index, int[] bucket, int target) {

if (index == nums.length) {

// 檢查所有桶的數(shù)字之和是否都是 target

for (int i = 0; i 《 bucket.length; i++) {

if (bucket[i] != target) {

return false;

}

}

// nums 成功平分成 k 個(gè)子集

return true;

}

// 窮舉 nums[index] 可能裝入的桶

for (int i = 0; i 《 bucket.length; i++) {

// 剪枝,桶裝裝滿了

if (bucket[i] + nums[index] 》 target) {

continue;

}

// 將 nums[index] 裝入 bucket[i]

bucket[i] += nums[index];

// 遞歸窮舉下一個(gè)數(shù)字的選擇

if (backtrack(nums, index + 1, bucket, target)) {

return true;

}

// 撤銷選擇

bucket[i] -= nums[index];

}

// nums[index] 裝入哪個(gè)桶都不行

return false;

}

有之前的鋪墊,相信這段代碼是比較容易理解的。這個(gè)解法雖然能夠通過(guò),但是耗時(shí)比較多,其實(shí)我們可以再做一個(gè)優(yōu)化。

主要看backtrack函數(shù)的遞歸部分:

for (int i = 0; i 《 bucket.length; i++) {

// 剪枝

if (bucket[i] + nums[index] 》 target) {

continue;

}

if (backtrack(nums, index + 1, bucket, target)) {

return true;

}

}

如果我們讓盡可能多的情況命中剪枝的那個(gè) if 分支,就可以減少遞歸調(diào)用的次數(shù),一定程度上減少時(shí)間復(fù)雜度。

如何盡可能多的命中這個(gè) if 分支呢?要知道我們的index參數(shù)是從 0 開(kāi)始遞增的,也就是遞歸地從 0 開(kāi)始遍歷nums數(shù)組。

如果我們提前對(duì)nums數(shù)組排序,把大的數(shù)字排在前面,那么大的數(shù)字會(huì)先被分配到bucket中,對(duì)于之后的數(shù)字,bucket[i] + nums[index]會(huì)更大,更容易觸發(fā)剪枝的 if 條件。

所以可以在之前的代碼中再添加一些代碼:

public boolean canPartitionKSubsets(int[] nums, int k) {

// 其他代碼不變

// 。..

/* 降序排序 nums 數(shù)組 */

Arrays.sort(nums);

int i = 0, j = nums.length - 1;

for (; i 《 j; i++, j--) {

// 交換 nums[i] 和 nums[j]

int temp = nums[i];

nums[i] = nums[j];

nums[j] = temp;

}

/*******************/

return backtrack(nums, 0, bucket, target);

}

由于 Java 的語(yǔ)言特性,這段代碼通過(guò)先升序排序再反轉(zhuǎn),達(dá)到降序排列的目的。

三、以桶的視角

文章開(kāi)頭說(shuō)了,以桶的視角進(jìn)行窮舉,每個(gè)桶需要遍歷nums中的所有數(shù)字,決定是否把當(dāng)前數(shù)字裝進(jìn)桶中;當(dāng)裝滿一個(gè)桶之后,還要裝下一個(gè)桶,直到所有桶都裝滿為止。

這個(gè)思路可以用下面這段代碼表示出來(lái):

// 裝滿所有桶為止

while (k 》 0) {

// 記錄當(dāng)前桶中的數(shù)字之和

int bucket = 0;

for (int i = 0; i 《 nums.length; i++) {

// 決定是否將 nums[i] 放入當(dāng)前桶中

bucket += nums[i] or 0;

if (bucket == target) {

// 裝滿了一個(gè)桶,裝下一個(gè)桶

k--;

break;

}

}

}

那么我們也可以把這個(gè) while 循環(huán)改寫(xiě)成遞歸函數(shù),不過(guò)比剛才略微復(fù)雜一些,首先寫(xiě)一個(gè)backtrack遞歸函數(shù)出來(lái):

boolean backtrack(int k, int bucket,

int[] nums, int start, boolean[] used, int target);

不要被這么多參數(shù)嚇到,我會(huì)一個(gè)個(gè)解釋這些參數(shù)。如果你能夠透徹理解本文,也能得心應(yīng)手地寫(xiě)出這樣的回溯函數(shù)。

這個(gè)backtrack函數(shù)的參數(shù)可以這樣解釋:

現(xiàn)在k號(hào)桶正在思考是否應(yīng)該把nums[start]這個(gè)元素裝進(jìn)來(lái);目前k號(hào)桶里面已經(jīng)裝的數(shù)字之和為bucket;used標(biāo)志某一個(gè)元素是否已經(jīng)被裝到桶中;target是每個(gè)桶需要達(dá)成的目標(biāo)和。

根據(jù)這個(gè)函數(shù)定義,可以這樣調(diào)用backtrack函數(shù):

public boolean canPartitionKSubsets(int[] nums, int k) {

// 排除一些基本情況

if (k 》 nums.length) return false;

int sum = 0;

for (int v : nums) sum += v;

if (sum % k != 0) return false;

boolean[] used = new boolean[nums.length];

int target = sum / k;

// k 號(hào)桶初始什么都沒(méi)裝,從 nums[0] 開(kāi)始做選擇

return backtrack(k, 0, nums, 0, used, target);

}

實(shí)現(xiàn)backtrack函數(shù)的邏輯之前,再重復(fù)一遍,從桶的視角:

1、需要遍歷nums中所有數(shù)字,決定哪些數(shù)字需要裝到當(dāng)前桶中。

2、如果當(dāng)前桶裝滿了(桶內(nèi)數(shù)字和達(dá)到target),則讓下一個(gè)桶開(kāi)始執(zhí)行第 1 步。

下面的代碼就實(shí)現(xiàn)了這個(gè)邏輯:

boolean backtrack(int k, int bucket,

int[] nums, int start, boolean[] used, int target) {

// base case

if (k == 0) {

// 所有桶都被裝滿了,而且 nums 一定全部用完了

// 因?yàn)?target == sum / k

return true;

}

if (bucket == target) {

// 裝滿了當(dāng)前桶,遞歸窮舉下一個(gè)桶的選擇

// 讓下一個(gè)桶從 nums[0] 開(kāi)始選數(shù)字

return backtrack(k - 1, 0 ,nums, 0, used, target);

}

// 從 start 開(kāi)始向后探查有效的 nums[i] 裝入當(dāng)前桶

for (int i = start; i 《 nums.length; i++) {

// 剪枝

if (used[i]) {

// nums[i] 已經(jīng)被裝入別的桶中

continue;

}

if (nums[i] + bucket 》 target) {

// 當(dāng)前桶裝不下 nums[i]

continue;

}

// 做選擇,將 nums[i] 裝入當(dāng)前桶中

used[i] = true;

bucket += nums[i];

// 遞歸窮舉下一個(gè)數(shù)字是否裝入當(dāng)前桶

if (backtrack(k, bucket, nums, i + 1, used, target)) {

return true;

}

// 撤銷選擇

used[i] = false;

bucket -= nums[i];

}

// 窮舉了所有數(shù)字,都無(wú)法裝滿當(dāng)前桶

return false;

}

至此,這道題的第二種思路也完成了。

四、最后總結(jié)

本文寫(xiě)的這兩種思路都可以通過(guò)所有測(cè)試用例,不過(guò)第一種解法即便經(jīng)過(guò)了排序優(yōu)化,也明顯比第二種解法慢很多,這是為什么呢?

我們來(lái)分析一下這兩個(gè)算法的時(shí)間復(fù)雜度,假設(shè)nums中的元素個(gè)數(shù)為n。

先說(shuō)第一個(gè)解法,也就是從數(shù)字的角度進(jìn)行窮舉,n個(gè)數(shù)字,每個(gè)數(shù)字有k個(gè)桶可供選擇,所以組合出的結(jié)果個(gè)數(shù)為k^n,時(shí)間復(fù)雜度也就是O(k^n)。

第二個(gè)解法,每個(gè)桶要遍歷n個(gè)數(shù)字,選擇「裝入」或「不裝入」,組合的結(jié)果有2^n種;而我們有k個(gè)桶,所以總的時(shí)間復(fù)雜度為O(k*2^n)。

當(dāng)然,這是理論上的最壞復(fù)雜度,實(shí)際的復(fù)雜度肯定要好一些,畢竟我們添加了這么多剪枝邏輯。不過(guò),從復(fù)雜度的上界已經(jīng)可以看出第一種思路要慢很多了。

所以,誰(shuí)說(shuō)回溯算法沒(méi)有技巧性的?雖然回溯算法就是暴力窮舉,但窮舉也分聰明的窮舉方式和低效的窮舉方式,關(guān)鍵看你以誰(shuí)的「視角」進(jìn)行窮舉。

通俗來(lái)說(shuō),我們應(yīng)該盡量「少量多次」,就是說(shuō)寧可多做幾次選擇,也不要給太大的選擇空間;寧可「二選一」選k次,也不要 「k選一」選一次。

這道題我們從兩種視角進(jìn)行窮舉,雖然代碼量看起來(lái)多,但核心邏輯都是類似的,相信你通過(guò)本文能夠更深刻地理解回溯算法。
編輯:lyn

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4381

    瀏覽量

    64895
  • 回溯算法
    +關(guān)注

    關(guān)注

    0

    文章

    10

    瀏覽量

    6683

原文標(biāo)題:回溯算法牛逼!

文章出處:【微信號(hào):TheAlgorithm,微信公眾號(hào):算法與數(shù)據(jù)結(jié)構(gòu)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    生產(chǎn)線回溯追溯系統(tǒng)選型:中設(shè)智控方案如何破解行業(yè)痛點(diǎn)?

    中設(shè)智控產(chǎn)線回溯追溯方案,從硬件到功能,精準(zhǔn)破解行業(yè)痛點(diǎn),為電子制造、新能源等行業(yè)提供高效、可靠的生產(chǎn)管理工具,助力企業(yè)實(shí)現(xiàn)智能化生產(chǎn)升級(jí),值得選型參考。
    的頭像 發(fā)表于 07-18 11:19 ?147次閱讀
    生產(chǎn)線<b class='flag-5'>回溯</b>追溯系統(tǒng)選型:中設(shè)智控方案如何破解行業(yè)痛點(diǎn)?

    基于FPGA實(shí)現(xiàn)FOC算法之PWM模塊設(shè)計(jì)

    哈嘍,大家好,從今天開(kāi)始正式帶領(lǐng)大家從零到一,在FPGA平臺(tái)上實(shí)現(xiàn)FOC算法,整個(gè)算法的框架如下圖所示,如果大家對(duì)算法的原理不是特別清楚的話,可以先去百度上學(xué)習(xí)一下,本教程著重介紹實(shí)現(xiàn)
    的頭像 發(fā)表于 07-17 15:21 ?597次閱讀
    基于FPGA實(shí)現(xiàn)FOC<b class='flag-5'>算法</b>之PWM模塊設(shè)計(jì)

    山東LP-SCADA故障回溯功能的好處

    關(guān)鍵字:LP-SCADA, LP-SCADA平臺(tái) , LP-SCADA系統(tǒng), 軟件回溯功能,藍(lán)鵬測(cè)控 得益于本平臺(tái)毫秒級(jí)的采集延遲,本平臺(tái)除了具有普通監(jiān)控采集平臺(tái)的所有監(jiān)控功能外,還可用于產(chǎn)線、設(shè)備
    發(fā)表于 05-29 14:42

    FOC 算法實(shí)現(xiàn)永磁同步電機(jī)調(diào)整指南

    本文檔介紹了使用 FOC 算法實(shí)現(xiàn)永磁同步電機(jī) (Permanent Magnet SynchronousMotor,PMSM)調(diào)整所需的步驟和設(shè)置,該算法如 AN1078《PMSM 電機(jī)的無(wú)傳感器
    發(fā)表于 03-03 01:53

    什么是BP神經(jīng)網(wǎng)絡(luò)的反向傳播算法

    BP神經(jīng)網(wǎng)絡(luò)的反向傳播算法(Backpropagation Algorithm)是一種用于訓(xùn)練神經(jīng)網(wǎng)絡(luò)的有效方法。以下是關(guān)于BP神經(jīng)網(wǎng)絡(luò)的反向傳播算法介紹: 一、基本概念 反向傳播
    的頭像 發(fā)表于 02-12 15:18 ?771次閱讀

    請(qǐng)問(wèn)關(guān)于ADS5407內(nèi)部寄存器有沒(méi)有相關(guān)的中文介紹的?

    請(qǐng)問(wèn)關(guān)于ADS5407內(nèi)部寄存器有沒(méi)有相關(guān)的中文介紹的?其中有幾個(gè)寄存器的功能不是特別明白,麻煩啦
    發(fā)表于 01-17 07:36

    求LabVIEW程序代做,關(guān)于噪聲測(cè)量方面,需要matlab與labview混合編程,涉及優(yōu)化算法、PID控制等,可帶價(jià)聯(lián)系

    求LabVIEW程序代做,關(guān)于噪聲測(cè)量方面,需要matlab與labview混合編程,涉及優(yōu)化算法、PID控制等,可帶價(jià)聯(lián)系QQ2789223947
    發(fā)表于 12-11 17:27

    ?ISP算法及架構(gòu)分析介紹

    一、ISP算法及架構(gòu)分析介紹 ISP即Image Signal Processor,是一種圖像處理架構(gòu),不是我們用的下載器。 ISP其實(shí)算是圖像處理的一個(gè)特例,一般應(yīng)用于前端設(shè)備(相對(duì)于SENSOR
    的頭像 發(fā)表于 11-26 10:05 ?1905次閱讀
    ?ISP<b class='flag-5'>算法</b>及架構(gòu)分析<b class='flag-5'>介紹</b>

    【「從算法到電路—數(shù)字芯片算法的電路實(shí)現(xiàn)」閱讀體驗(yàn)】+內(nèi)容簡(jiǎn)介

    的Matlab建模和RTL設(shè)計(jì),可幫助數(shù)字IC設(shè)計(jì)者掌握常用算法設(shè)計(jì)思路、工具和流程,從根本上提高設(shè)計(jì)基本算法電路和復(fù)雜算法電路的能力。本書(shū)共分為12章。第1~2章介紹
    發(fā)表于 11-21 17:14

    【「從算法到電路—數(shù)字芯片算法的電路實(shí)現(xiàn)」閱讀體驗(yàn)】+介紹基礎(chǔ)硬件算法模塊

    作為嵌入式開(kāi)發(fā)者往往比較關(guān)注硬件和軟件的協(xié)調(diào)。本書(shū)介紹了除法器,信號(hào)發(fā)生器,濾波器,分頻器等基本算法的電路實(shí)現(xiàn),雖然都是基礎(chǔ)內(nèi)容,但是也是最常用到的基本模塊。 隨著逆全球化趨勢(shì)的出現(xiàn),過(guò)去的研發(fā)
    發(fā)表于 11-21 17:05

    【「從算法到電路—數(shù)字芯片算法的電路實(shí)現(xiàn)」閱讀體驗(yàn)】+一本介紹基礎(chǔ)硬件算法模塊實(shí)現(xiàn)的好書(shū)

    作為嵌入式開(kāi)發(fā)者往往比較關(guān)注硬件和軟件的協(xié)調(diào)。本書(shū)介紹了除法器,信號(hào)發(fā)生器,濾波器,分頻器等基本算法的電路實(shí)現(xiàn),雖然都是基礎(chǔ)內(nèi)容,但是也是最常用到的基本模塊,本書(shū)的內(nèi)容比較對(duì)本人胃口。 我們先來(lái)
    發(fā)表于 11-20 13:42

    關(guān)于MAC地址申請(qǐng)與運(yùn)用的常見(jiàn)問(wèn)題

    。了解完MAC地址碼,大家應(yīng)該也想知道MAC地址申請(qǐng)與運(yùn)用過(guò)程中容易遇到什么樣的問(wèn)題。接下來(lái)英利檢測(cè)將針對(duì)這兩點(diǎn)給大家深入分析,幫助大家了解。常見(jiàn)問(wèn)題如何找到設(shè)備的
    的頭像 發(fā)表于 11-07 16:42 ?851次閱讀
    <b class='flag-5'>關(guān)于</b>MAC地址申請(qǐng)與<b class='flag-5'>運(yùn)用</b>的常見(jiàn)問(wèn)題

    dp接口的最新技術(shù)發(fā)展

    深度優(yōu)先搜索(DFS)是一種基本的算法,用于遍歷或搜索樹(shù)或圖。它從一個(gè)頂點(diǎn)開(kāi)始,盡可能深地搜索樹(shù)的分支。當(dāng)搜索到最深節(jié)點(diǎn)時(shí),然后回溯。DFS可以用于解決許多問(wèn)題,如尋找路徑、檢測(cè)循環(huán)、拓?fù)渑判虻?/div>
    的頭像 發(fā)表于 10-30 13:52 ?578次閱讀

    RVBacktrace RISC-V極簡(jiǎn)棧回溯組件

    RVBacktrace組件簡(jiǎn)介一個(gè)極簡(jiǎn)的RISC-V棧回溯組件。功能在需要的地方調(diào)用組件提供的唯一API,開(kāi)始當(dāng)前環(huán)境的棧回溯支持輸出addr2line需要的命令,使用addr2line進(jìn)行棧回溯支持結(jié)合反匯編,棧
    的頭像 發(fā)表于 09-15 08:12 ?825次閱讀
    RVBacktrace RISC-V極簡(jiǎn)棧<b class='flag-5'>回溯</b>組件

    回溯英特爾在跨越半個(gè)世紀(jì)的發(fā)展歷程

    我們以英特爾三位風(fēng)云人物的三句名言為線索,回溯英特爾在跨越半個(gè)世紀(jì)的發(fā)展歷程中,如何利用芯片技術(shù)的力量,影響信息時(shí)代,開(kāi)啟未來(lái)之門(mén)。
    的頭像 發(fā)表于 08-16 14:58 ?1247次閱讀