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

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

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

二叉排序樹AVL如何實(shí)現(xiàn)動(dòng)態(tài)平衡

算法與數(shù)據(jù)結(jié)構(gòu) ? 來源:bigsai ? 作者:bigsai ? 2021-10-28 17:02 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

什么是AVL樹

大家好,我是bigsai,好久不見,甚是想念,今天給大家講講AVL樹。

對(duì)于樹這種數(shù)據(jù)結(jié)構(gòu),想必大家也已經(jīng)不再陌生,我們簡單回顧一下。

在樹的種類中,通常分成二叉樹和多叉樹,我們熟悉的二叉樹種類有二叉搜索(排序、查找)樹、二叉平衡樹、伸展樹、紅黑樹等等。而熟悉的多叉樹像B樹、字典樹都是經(jīng)典多叉樹。

普通的二叉樹,我們研究其遍歷方式,因?yàn)槠錄]啥規(guī)則約束查找和插入都很隨意所以很少有研究價(jià)值。

但是二叉樹結(jié)構(gòu)上很有特點(diǎn):左孩子和右孩子,兩個(gè)不同方向的孩子對(duì)應(yīng)二進(jìn)制的01,判斷的對(duì)錯(cuò),比較的大小,所以根據(jù)這個(gè)結(jié)構(gòu)所有樹左側(cè)節(jié)點(diǎn)比父節(jié)點(diǎn)小,右側(cè)節(jié)點(diǎn)比父節(jié)點(diǎn)大,這時(shí)候就誕生了二叉搜索(排序)樹。二叉搜索(排序)樹的一大特點(diǎn)就是查找效率提高了,因?yàn)椴檎乙粋€(gè)元素位置或者查看元素是否存在通過每遇到一個(gè)節(jié)點(diǎn)直接進(jìn)行比較就可以一步步逼近結(jié)果的位置。

但二叉搜索(排序樹)有個(gè)很大的問題就是當(dāng)插入節(jié)點(diǎn)很有序,很可能成為一棵斜樹或者深度很高,那么這樣的一個(gè)查找效率還是趨近于線性O(shè)(n)級(jí)別,所以這種情況二叉搜索(排序)樹的效率是比較低的。

所以,人們有個(gè)期望:對(duì)一棵樹來說插入節(jié)點(diǎn),小的還在左面,大的還在右面方便查找,但是能不能不要出現(xiàn)那么斜的情況?

這不,平衡二叉搜索(AVL)樹就是這么干的,AVL在插入的時(shí)候每次都會(huì)旋轉(zhuǎn)自平衡,讓整個(gè)樹一直處于平衡狀態(tài),讓整個(gè)樹的查詢更加穩(wěn)定(logN)。我們首先來看一下什么是AVL樹:

  • AVL樹是帶有平衡條件的二叉搜索樹,這個(gè)平衡條件必須要容易保持,而且要保證它的深度是O(logN)。

  • AVL的左右子樹的高度差(平衡因子)不大于1,并且它的每個(gè)子樹也都是平衡二叉樹。

  • 對(duì)于平衡二叉樹的最小個(gè)數(shù),n0=0;n1=1;nk=n(k-1)+n(k-2)+1;(求法可以類比斐波那契)

難點(diǎn):AVL是一顆二叉排序樹,用什么樣的規(guī)則或者規(guī)律讓它能夠在復(fù)雜度不太高的情況下實(shí)現(xiàn)動(dòng)態(tài)平衡呢?

不平衡情況

如果從簡單情況模型看,其實(shí)四種不平衡情況很簡單,分別是RR,LL,RL,LR四種不平衡情況。

然后將其平衡的結(jié)果也很容易(不考慮其附帶節(jié)點(diǎn)只看結(jié)果),將中間大小數(shù)值移動(dòng)最上方,其他相對(duì)位置不變即可:

當(dāng)然,這個(gè)僅僅是針對(duì)三個(gè)節(jié)點(diǎn)情況太過于理想化了,很多時(shí)候讓你找不平衡的點(diǎn),或者我們?cè)诮鉀Q不平衡的時(shí)候,我們需要的就是找到第一個(gè)不平衡(從底往上)的點(diǎn)將其平衡即可,下面列舉兩個(gè)不平衡的例子:

上述四種不平衡條件情況,可能出現(xiàn)在底部,也可能出現(xiàn)在頭,也可能出現(xiàn)在某個(gè)中間節(jié)點(diǎn)導(dǎo)致不平衡,而我們只需要研究其首次不平衡點(diǎn),解決之后整棵樹即繼續(xù)平衡,在具體的處理上我們使用遞歸的方式解決問題。

四種不平衡情況處理

針對(duì)四種不平衡的情況,這里對(duì)每種情況進(jìn)行詳細(xì)的講解。

RR平衡旋轉(zhuǎn)(左單旋轉(zhuǎn))

這里的RR指的是節(jié)點(diǎn)模型的樣子,其含義是需要左單旋轉(zhuǎn)(記憶時(shí)候需要注意一下RR不是右旋轉(zhuǎn))!

出現(xiàn)這種情況的原因是節(jié)點(diǎn)的右側(cè)的右側(cè)較深這時(shí)候不平衡節(jié)點(diǎn)需要左旋,再細(xì)看過程。

  • 在左旋的過程中,root(oldroot)節(jié)點(diǎn)下沉,中間節(jié)點(diǎn)(newroot)上浮.而其中中間節(jié)點(diǎn)(newroot)的右側(cè)依然不變。

  • 它上浮左側(cè)所以需要指向根節(jié)點(diǎn)(oldroot)(畢竟一棵樹)。但是這樣newroot原來左側(cè)節(jié)點(diǎn)H空缺。而我們需要仍然讓整個(gè)樹完整并且滿足二叉排序樹的規(guī)則

  • 而剛好本來oldroot右側(cè)指向newroot現(xiàn)在結(jié)構(gòu)改變oldroot右側(cè)空缺,剛好這個(gè)位置滿足在oldroot的右側(cè),在newroot的左側(cè),所以我們將H插入在這個(gè)位置。

  • 其中H可能為NULL,不過不影響操作!

其更詳細(xì)流程為:

而左旋的代碼可以表示為:

privatenodegetRRbanlance(nodeoldroot){//右右深,需要左旋
//TODOAuto-generatedmethodstub
nodenewroot=oldroot.right;
oldroot.right=newroot.left;
newroot.left=oldroot;
oldroot.height=Math.max(getHeight(oldroot.left),getHeight(oldroot.right))+1;
newroot.height=Math.max(getHeight(newroot.left),getHeight(newroot.right))+1;//原來的root的高度需要從新計(jì)算
returnnewroot;
}

LL平衡旋轉(zhuǎn)(右單旋轉(zhuǎn))

而右旋和左旋相反,但是思路相同,根據(jù)上述進(jìn)行替換即可!


代碼:

privatenodegetLLbanlance(nodeoldroot){//LL小,需要右旋轉(zhuǎn)
//TODOAuto-generatedmethodstub
nodenewroot=oldroot.left;
oldroot.left=newroot.right;
newroot.right=oldroot;
oldroot.height=Math.max(getHeight(oldroot.left),getHeight(oldroot.right))+1;
newroot.height=Math.max(getHeight(newroot.left),getHeight(newroot.right))+1;//原來的root的高度需要從新金酸
returnnewroot;
}

RL平衡旋轉(zhuǎn)(先右后左雙旋轉(zhuǎn))

這個(gè)RL你可能有點(diǎn)懵圈,為啥RR叫左旋,LL叫右旋,這個(gè)RL怎么就叫先右后左旋轉(zhuǎn)了?

別急別急,這個(gè)之所以先后后左,是因?yàn)榫唧w需要中間節(jié)點(diǎn)右旋一次,然后上面節(jié)點(diǎn)左旋一次才能平衡,具體可以下面慢慢看。

首先產(chǎn)生這種不平衡的條件原因是:ROOT節(jié)點(diǎn)右側(cè)左側(cè)節(jié)點(diǎn)的深度高些,使得與左側(cè)的差大于1,這個(gè)與我們前面看到的左旋右旋不同因?yàn)樾D(zhuǎn)一次無法達(dá)到平衡!

對(duì)于右左結(jié)構(gòu),中間(R)的最大,兩側(cè)(ROOT,R.L)的最小,但是下面(R.L)的比上面(ROOT)大(R.LROOT右側(cè))所以如果平衡的話,那么R.L應(yīng)該在中間,而R應(yīng)該在右側(cè),原來的ROOT在左側(cè)。

這個(gè)過程節(jié)點(diǎn)的變化浮動(dòng)比較大,需要妥善處理各個(gè)子節(jié)點(diǎn)的移動(dòng)使其滿足二叉排序樹的性質(zhì)!

這種雙旋轉(zhuǎn)具體實(shí)現(xiàn)其實(shí)也不難,不要被外表唬住,這里面雙旋轉(zhuǎn)我提供兩種解答方法。


思路(標(biāo)準(zhǔn)答案)1:兩次旋轉(zhuǎn)RR,LL

這個(gè)處理起來非常容易,因?yàn)榍懊嬉呀?jīng)解決RR(左旋),LL(右旋)的問題,所以這里面在上面基礎(chǔ)上可以直接解決,首先對(duì)R節(jié)點(diǎn)進(jìn)行一次LL右旋,旋轉(zhuǎn)一次之后R在最右側(cè),這就轉(zhuǎn)化成RR不平衡旋轉(zhuǎn)的問題了,所以這個(gè)時(shí)候以ROOT開始一次RR左旋即可完成平衡,具體流程可以參考下面這張圖。

思路(個(gè)人方法)2:直接分析

根據(jù)初始和結(jié)果的狀態(tài),然后分析各個(gè)節(jié)點(diǎn)變化順序=,手動(dòng)操作這些節(jié)點(diǎn)即可。其實(shí)不管你怎么操作,只要能滿足最后結(jié)構(gòu)一致就行啦!

首先根據(jù)ROOT,R,R.L三個(gè)節(jié)點(diǎn)變化,R.L肯定要在最頂層,左右分別指向ROOT和R,那么這其中R.left,ROOT.right發(fā)生變化(原來分別是R.L和R)暫時(shí)為空。而剛好根據(jù)左右大小關(guān)系可以補(bǔ)上R.L原來的孩子節(jié)點(diǎn)A,B。

代碼為:(注釋部分為方案1)

privatenodegetRLbanlance(nodeoldroot){//右左深
//nodenewroot=oldroot.right.left;
//oldroot.right.left=newroot.right;
//newroot.right=oldroot.right;
//oldroot.right=newroot.left;
//newroot.left=oldroot;
//oldroot.height=Math.max(getHeight(oldroot.left),getHeight(oldroot.right))+1;
//newroot.right.height=Math.max(getHeight(newroot.right.left),getHeight(newroot.right.right))+1;
//newroot.height=Math.max(getHeight(oldroot.left),getHeight(newroot.right))+1;//原來的root的高度需要從新金酸
oldroot.right=getLLbanlance(oldroot.right);
oldroot.height=Math.max(getHeight(oldroot.left),getHeight(oldroot.right))+1;
returngetRRbanlance(oldroot);

}

LR平衡旋轉(zhuǎn)(先左后右雙旋轉(zhuǎn))

這個(gè)情況和RL情況相似,采取相同操作即可。

根據(jù)上述RL修改即可

這部分代碼為

privatenodegetLRbanlance(nodeoldroot){
oldroot.left=getRRbanlance(oldroot.left);
oldroot.height=Math.max(getHeight(oldroot.left),getHeight(oldroot.right))+1;
returngetLLbanlance(oldroot);

}

代碼實(shí)現(xiàn)

首先對(duì)于節(jié)點(diǎn)多個(gè)height屬性。用于計(jì)算高度(平衡因子)

插入是遞歸插入,遞歸是一個(gè)來回的過程,去的過程進(jìn)行插入,回的過程進(jìn)行高度更新,和檢查是否平衡。推薦不要寫全局遞歸計(jì)算高度,效率太低下,事實(shí)上高度變化只和插入和平衡有關(guān),仔細(xì)考慮即不會(huì)有疏漏!

代碼寫的比較早,如有命名不規(guī)范的情況,還請(qǐng)勿噴,如果有疏漏還請(qǐng)指出!

importjava.util.ArrayDeque;
importjava.util.Queue;

publicclassAVLTree{

classnode
{
intvalue;
nodeleft;
noderight;
intheight;
publicnode(){

}
publicnode(intvalue)
{
this.value=value;
this.height=0;
}
publicnode(intvalue,nodeleft,noderight)
{
this.value=value;
this.left=left;this.right=right;
this.height=0;
}
}
noderoot;//根

publicAVLTree(){
this.root=null;
}

publicbooleanisContains(intx)//是否存在
{
nodecurrent=root;
if(root==null){
returnfalse;
}
while(current.value!=x&¤t!=null){
if(xif(x>current.value){
current=current.right;
}
if(current==null){
returnfalse;
}//在里面判斷如果超直接返回
}
//如果在這個(gè)位置判斷是否為空會(huì)導(dǎo)致current.value不存在報(bào)錯(cuò)
if(current.value==x){
returntrue;
}
returnfalse;
}

publicintgetHeight(nodet)
{
if(t==null){return-1;}//
returnt.height;
//return1+Math.max(getHeight(t.left),getHeight(t.right));這種效率太低
}
publicvoidcengxu(nodet){//層序遍歷
Queueq1=newArrayDeque();
if(t==null)
return;
if(t!=null){
q1.add(t);
}
while(!q1.isEmpty()){
nodet1=q1.poll();
if(t1.left!=null)
q1.add(t1.left);
if(t1.right!=null)
q1.add(t1.right);
System.out.print(t1.value+"");
}
System.out.println();
}
publicvoidzhongxu(nodet)//中序遍歷中序遍歷:左子樹--->根結(jié)點(diǎn)--->右子樹
{//為了測(cè)試改成中后都行
if(t!=null)
{
zhongxu(t.left);
System.out.print(t.value+"");//訪問完左節(jié)點(diǎn)訪問當(dāng)前節(jié)點(diǎn)
zhongxu(t.right);
//System.out.print(t.value+"");//訪問完左節(jié)點(diǎn)訪問當(dāng)前節(jié)點(diǎn)
}
}
publicvoidqianxu(nodet)//前序遞歸前序遍歷:根結(jié)點(diǎn)--->左子樹--->右子樹
{
if(t!=null){
System.out.print(t.value+"");//當(dāng)前節(jié)點(diǎn)
qianxu(t.left);
qianxu(t.right);}
}
publicvoidinsert(intvalue){
root=insert(value,root);
}
publicnodeinsert(intx,nodet)//插入t是root的引用
{
nodea1=newnode(x);
//if(root==null){root=a1;returnroot;}
if(t==null){returna1;}
//插入操作。遞歸實(shí)現(xiàn)
elseif(t!=null)
{
if(xelse
{t.right=insert(x,t.right);}
}
/*
*更新當(dāng)前節(jié)點(diǎn)的高度,因?yàn)檎麄€(gè)插入只有被插入的一方有影響,
*所以遞歸會(huì)更新好最底層的,上層可直接調(diào)用
*/
t.height=Math.max(getHeight(t.left),getHeight(t.right))+1;//不要寫成遞歸,遞歸效率低
returnbanlance(t);//因?yàn)閖ava對(duì)象傳參機(jī)制,需要克隆,不可直接t=xx否則變換
}

privatenodebanlance(nodet){
//TODOAuto-generatedmethodstub
//if(t==null)returnnull;
intlefthigh=getHeight(t.left);
intrighthigh=getHeight(t.right);
if(Math.abs(lefthigh-righthigh)<=1)//不需要平衡滴
{returnt;}
elseif(lefthigh//右側(cè)大
{
if(getHeight(t.right.left)//RR需要左旋
{
returngetRRbanlance(t);
}
else{
returngetRLbanlance(t);
}
}
else{
if(getHeight(t.left.left)>getHeight(t.left.right))//ll左左
{
returngetLLbanlance(t);
}
else{
returngetLRbanlance(t);
}
}
}
/*
*oldroot(平衡因子為2,不平衡)==>newroot
*//
*Bnewroot(平衡因子為1)oldrootD
*//
*CDBCE
*
*E
*/

privatenodegetRRbanlance(nodeoldroot){//右右深,需要左旋
//TODOAuto-generatedmethodstub
nodenewroot=oldroot.right;
oldroot.right=newroot.left;
newroot.left=oldroot;
oldroot.height=Math.max(getHeight(oldroot.left),getHeight(oldroot.right))+1;
newroot.height=Math.max(getHeight(newroot.left),getHeight(newroot.right))+1;//原來的root的高度需要從新計(jì)算
returnnewroot;
}
/*
*右旋同理
*/
privatenodegetLLbanlance(nodeoldroot){//LL小,需要右旋轉(zhuǎn)
//TODOAuto-generatedmethodstub
nodenewroot=oldroot.left;
oldroot.left=newroot.right;
newroot.right=oldroot;
oldroot.height=Math.max(getHeight(oldroot.left),getHeight(oldroot.right))+1;
newroot.height=Math.max(getHeight(newroot.left),getHeight(newroot.right))+1;//原來的root的高度需要從新金酸
returnnewroot;
}

privatenodegetLRbanlance(nodeoldroot){
oldroot.left=getRRbanlance(oldroot.left);
oldroot.height=Math.max(getHeight(oldroot.left),getHeight(oldroot.right))+1;
returngetLLbanlance(oldroot);

}

/*(不平衡出現(xiàn)在右左節(jié)點(diǎn))
*oldroot==>newroot
*//
*ABoldrootB
*///
*newrootDAEFD
*/
*EF
*/

privatenodegetRLbanlance(nodeoldroot){//右左深
//nodenewroot=oldroot.right.left;
//oldroot.right.left=newroot.right;
//newroot.right=oldroot.right;
//oldroot.right=newroot.left;
//newroot.left=oldroot;
//oldroot.height=Math.max(getHeight(oldroot.left),getHeight(oldroot.right))+1;
//newroot.right.height=Math.max(getHeight(newroot.right.left),getHeight(newroot.right.right))+1;
//newroot.height=Math.max(getHeight(oldroot.left),getHeight(newroot.right))+1;//原來的root的高度需要從新金酸
oldroot.right=getLLbanlance(oldroot.right);
oldroot.height=Math.max(getHeight(oldroot.left),getHeight(oldroot.right))+1;
returngetRRbanlance(oldroot);

}
}

測(cè)試情況:

af7e133c-37a8-11ec-82a8-dac502259ad0.png

AVL的理解需要時(shí)間,當(dāng)然筆者的AVL自己寫的可能有些疏漏,如果有問題還請(qǐng)各位一起探討!

當(dāng)然,除了插入,AVL還有刪除等其他操作,(原理相似。刪除后平衡)有興趣可以一起研究。

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

    關(guān)注

    0

    文章

    14

    瀏覽量

    10174
  • 二叉樹
    +關(guān)注

    關(guān)注

    0

    文章

    74

    瀏覽量

    12604

原文標(biāo)題:這個(gè)樹,怎么一下就平衡了?

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

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

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    天合光能對(duì)話零碳未來進(jìn)階之路

    隨著新型電力系統(tǒng)建設(shè)加速推進(jìn),能源市場機(jī)制正實(shí)現(xiàn)電源側(cè)、電網(wǎng)側(cè)與需求側(cè)的三向動(dòng)態(tài)平衡,這不僅對(duì)電力系統(tǒng)的靈活性、安全性提出更高要求,也加快了源網(wǎng)荷儲(chǔ)一體化的系統(tǒng)重構(gòu)進(jìn)程。
    的頭像 發(fā)表于 07-03 14:46 ?146次閱讀

    虹科分享 功夫機(jī)器人來了!CMG擂臺(tái)之上的技術(shù)決勝點(diǎn)是什么?

    全球首個(gè)以人形機(jī)器人為參賽主體的 CMG 世界機(jī)器人格斗擂臺(tái)考驗(yàn)機(jī)器人動(dòng)態(tài)平衡等技術(shù)。技術(shù)決勝維度包括超低延遲、多模態(tài)融合、抗干擾設(shè)計(jì)。虹科提供全棧式解決方案,涵蓋 PCAN、EtherCAT 方案及靈巧手,助力人形機(jī)器人應(yīng)用落地,提供全流程技術(shù)支持
    的頭像 發(fā)表于 06-03 13:25 ?270次閱讀
    虹科分享  功夫機(jī)器人來了!CMG擂臺(tái)之上的技術(shù)決勝點(diǎn)是什么?

    低成本電源排序器解決方案

    絕大多數(shù)負(fù)載點(diǎn)DC-DC轉(zhuǎn)換器可以將上一個(gè)轉(zhuǎn)換器的電源就緒輸出連接至下一個(gè)轉(zhuǎn)換器的使能輸入,實(shí)現(xiàn)上電排序。這種方法只適合比較簡單的設(shè)計(jì),不能滿足多數(shù)現(xiàn)代微處理器和DSP的要求一這類器件要求斷電順序必須與上電順序相反。許多廠商針對(duì)這類應(yīng)用推出了可編程
    的頭像 發(fā)表于 05-21 09:55 ?485次閱讀
    低成本電源<b class='flag-5'>排序</b>器解決方案

    從“卡脖子”到動(dòng)態(tài)平衡:智能配電技術(shù)如何重塑新能源消納生態(tài)?

    安科瑞銷售工程師徐悅18702111076 為什么新能源消納成為難題? 波動(dòng)性與不可控性 風(fēng)光發(fā)電依賴天氣,出力隨機(jī)性強(qiáng)(如晴天光伏發(fā)電高,陰天驟降),導(dǎo)致電網(wǎng)供需難以實(shí)時(shí)匹配。 電網(wǎng)承載力有限 傳統(tǒng)電網(wǎng)設(shè)計(jì)以穩(wěn)定可控的火電為主,難以適應(yīng)新能源的大規(guī)模波動(dòng)性接入。 地域供需錯(cuò)配 新能源資源富集區(qū)(如西北風(fēng)電基地)與用電負(fù)荷中心(如東部沿海)距離遠(yuǎn),輸電通道不足。 儲(chǔ)能與調(diào)節(jié)能力不足 新能源發(fā)電高峰時(shí)段若無法存儲(chǔ),可能被迫“棄
    的頭像 發(fā)表于 03-18 16:31 ?473次閱讀
    從“卡脖子”到<b class='flag-5'>動(dòng)態(tài)平衡</b>:智能配電技術(shù)如何重塑新能源消納生態(tài)?

    AI服務(wù)器液冷散熱如何實(shí)現(xiàn)動(dòng)態(tài)平衡

    能力提升百倍以上的優(yōu)勢(shì),正成為AI算力基礎(chǔ)設(shè)施的核心支撐。 在液冷系統(tǒng)實(shí)際應(yīng)用中,流量控制精度直接影響著散熱效能與系統(tǒng)安全。當(dāng)前行業(yè)面臨三大技術(shù)痛點(diǎn): 1、動(dòng)態(tài)流量匹配失衡 在服務(wù)器負(fù)載劇烈波動(dòng)場景下,固定流量模式易導(dǎo)致局部熱點(diǎn)形成,
    的頭像 發(fā)表于 03-06 17:32 ?432次閱讀
    AI服務(wù)器液冷散熱如何<b class='flag-5'>實(shí)現(xiàn)</b><b class='flag-5'>動(dòng)態(tài)平衡</b>?

    紐迪瑞通過Google Chromebook AVL認(rèn)證

    紐迪瑞筆電壓力觸控板方案成功通過Google Chromebook AVL(Approved Vendor List)認(rèn)證!這是全球首個(gè)通過此認(rèn)證的壓力觸控板方案,這意味著未來Chromebook可全線搭載紐迪瑞壓力觸控板,為用戶帶來更流暢、更可靠的觸控體驗(yàn)!
    的頭像 發(fā)表于 02-21 16:10 ?434次閱讀

    平衡電阻器可以改為不平衡

    在電子電路中,平衡電阻器與不平衡電阻器各自扮演著重要的角色。平衡電阻器主要用于實(shí)現(xiàn)電路的平衡和穩(wěn)定性,減少噪音和干擾,提高信號(hào)質(zhì)量。而不
    的頭像 發(fā)表于 01-30 14:31 ?1135次閱讀

    詳解Linux sort命令之掌握排序技巧與實(shí)用案例

    在linux系統(tǒng)使用過程中,提供了sort排序命令,支持常用的排序功能。 常用參數(shù) sort命令支持很多參數(shù),常用參數(shù)如下: ? 短參數(shù) 長參數(shù) 說明 -n – number-sort 按字符串?dāng)?shù)值
    的頭像 發(fā)表于 01-09 10:10 ?886次閱讀

    嵌入式學(xué)習(xí)-飛凌嵌入式ElfBoard ELF 1板卡-初識(shí)設(shè)備之設(shè)備組成和結(jié)構(gòu)

    的name和value。在設(shè)備中,可描述的信息包括:一、CPU的數(shù)量和類別;、內(nèi)存基地址和大??;三、總線和橋;四、外設(shè)連接;五、中斷控制器和中斷使用情況;六、GPIO控制器和GPIO使用情況;七
    發(fā)表于 01-08 08:32

    飛凌嵌入式ElfBoard ELF 1板卡-初識(shí)設(shè)備之設(shè)備組成和結(jié)構(gòu)

    的name和value。在設(shè)備中,可描述的信息包括:一、CPU的數(shù)量和類別;、內(nèi)存基地址和大小;三、總線和橋;四、外設(shè)連接;五、中斷控制器和中斷使用情況;六、GPIO控制器和GPIO使用情況;七
    發(fā)表于 01-07 09:16

    ADS1293增強(qiáng)導(dǎo)聯(lián)aVR、aVF、aVL波形都出不來是怎么回事?

    FLEX_CH1_CN0X010X0CaVR ECG1:IN1-IN4 FLEX_CH2_CN0X020X15aVL ECG2:IN2-IN5 FLEX_CH3_CN0X030X1EaVF ECG3
    發(fā)表于 01-02 06:05

    時(shí)間復(fù)雜度為 O(n^2) 的排序算法

    , O(n2) 的排序算法可能會(huì)比 O(nlogn) 的排序算法執(zhí)行效率高。不過隨著數(shù)據(jù)規(guī)模增大, O(nlogn) 的排序算法是不選擇。本篇我們主要對(duì) O(n2) 的
    的頭像 發(fā)表于 10-19 16:31 ?1690次閱讀
    時(shí)間復(fù)雜度為 O(n^2) 的<b class='flag-5'>排序</b>算法

    平衡閥正確安裝使用方法介紹

    平衡閥是在水力工況下,起到動(dòng)態(tài)、靜態(tài)平衡調(diào)節(jié)的閥門。平衡閥可分為三種類型:靜態(tài)平衡閥、動(dòng)態(tài)平衡
    的頭像 發(fā)表于 10-10 16:37 ?3653次閱讀
    <b class='flag-5'>平衡</b>閥正確安裝使用方法介紹

    什么是默克爾(Merkle Tree)?如何計(jì)算默克爾根?

    01 默克爾的概念 默克爾(Merkle Tree)是一種特殊的二叉樹,它的每個(gè)節(jié)點(diǎn)都存儲(chǔ)了一個(gè)數(shù)據(jù)塊的哈希值。哈希值是一種可以將任意長度的數(shù)據(jù)轉(zhuǎn)換為固定長度的字符串的算法,它具有唯一性和不可
    的頭像 發(fā)表于 09-30 18:22 ?2203次閱讀
    什么是默克爾<b class='flag-5'>樹</b>(Merkle Tree)?如何計(jì)算默克爾根?

    指電極上覆蓋敏感材料的阻值計(jì)算

    覆蓋的敏感材料厚度超出指厚度時(shí)計(jì)算電阻,是否可以視作指電極指間電阻多個(gè)周期串聯(lián)后與超出指厚度部分敏感材料電阻并聯(lián)
    發(fā)表于 07-05 14:48

    電子發(fā)燒友

    中國電子工程師最喜歡的網(wǎng)站

    • 2931785位工程師會(huì)員交流學(xué)習(xí)
    • 獲取您個(gè)性化的科技前沿技術(shù)信息
    • 參加活動(dòng)獲取豐厚的禮品