DCT(離散余弦變換(DiscreteCosineTransform))

離散余弦變換(Discrete Cosine Transform,簡稱DCT變換)是一種與傅立葉變換緊密相關的數學運算。在傅立葉級數展開式中,如果被展開的函數是實偶函數,那么其傅立葉級數中只包含余弦項,再將其離散化可導出余弦變換,因此稱之為離散余弦變換。

離散余弦變換(Discrete Cosine Transform)

離散余弦變換(DCT)是N.Ahmed等人在1974年提出的正交變換方法。它常被認為是對語音和圖像信號進行變換的最佳方法。為了工程上實現的需要,國內外許多學者花費了很大精力去尋找或改進離散余弦變換的快速算法。由于近年來 數字信號處理芯片(DSP)的發展,加上 專用集成電路設計上的優勢,這就牢固地確立離散余弦變換(DCT)在目前圖像編碼中的重要地位,成為H.261、JPEG、MPEG 等國際上公用的編碼標準的重要環節。在視頻壓縮中,最常用的變換方法是DCT,DCT被認為是性能接近K-L變換的準最佳變換,變換編碼的主要特點有:   (1)在變換域里視頻圖像要比空間域里簡單。   (2)視頻圖像的相關性明顯下降,信號的能量主要集中在少數幾個變換系數上,采用量化和 熵編碼可有效地壓縮其數據。   (3)具有較強的抗干擾能力,傳輸過程中的誤碼對圖像質量的影響遠小于預測編碼。通常,對高質量的圖像,DMCP要求信道誤碼率 ,而變換編碼僅要求信道誤碼率 。   DCT等變換有快速算法,能實現實時視頻壓縮。針對目前采用的幀內編碼加 運動補償的視頻壓縮方法的不足, 我們在Westwater 等人提出三維 視頻編碼的基礎上, 將三維變換的結構應用于視頻 圖像壓縮, 進一步實現了新的視頻圖像序列的編碼方法。

離散余弦變換(英語:DCT for Discrete Cosine Transform)是與傅里葉變換相關的一種變換,它類似于離散傅里葉變換(DFT for Discrete Fourier Transform),但是只使用實數。離散余弦變換相當于一個長度大概是它兩倍的離散傅里葉變換,這個離散傅里葉變換是對一個實偶函數進行的(因為一個實偶函數的傅里葉變換仍然是一個實偶函數),在有些變形里面需要將輸入或者輸出的位置移動半個單位(DCT有8種標準類型,其中4種是常見的)。

最常用的一種離散余弦變換的類型是下面給出的第二種類型,通常我們所說的離散余弦變換指的就是這種。它的逆,也就是下面給出的第三種類型,通常相應的被稱為"反離散余弦變換","逆離散余弦變換"或者"IDCT"。

有兩個相關的變換,一個是離散正弦變換(DST for Discrete Sine Transform),它相當于一個長度大概是它兩倍的實奇函數的離散傅里葉變換;另一個是改進的離散余弦變換(MDCT for Modified Discrete Cosine Transform),它相當于對交疊的數據進行離散余弦變換。

離散余弦變換(英語:DCT for Discrete Cosine Transform)是與傅里葉變換相關的一種變換,它類似于離散傅里葉變換(DFT for Discrete Fourier Transform),但是只使用實數。離散余弦變換相當于一個長度大概是它兩倍的離散傅里葉變換,這個離散傅里葉變換是對一個實偶函數進行的(因為一個實偶函數的傅里葉變換仍然是一個實偶函數),在有些變形里面需要將輸入或者輸出的位置移動半個單位(DCT有8種標準類型,其中4種是常見的)。

最常用的一種離散余弦變換的類型是下面給出的第二種類型,通常我們所說的離散余弦變換指的就是這種。它的逆,也就是下面給出的第三種類型,通常相應的被稱為"反離散余弦變換","逆離散余弦變換"或者"IDCT"。

有兩個相關的變換,一個是離散正弦變換(DST for Discrete Sine Transform),它相當于一個長度大概是它兩倍的實奇函數的離散傅里葉變換;另一個是改進的離散余弦變換(MDCT for Modified Discrete Cosine Transform),它相當于對交疊的數據進行離散余弦變換。

File:Dandelion clock quarter dft dct.png

目錄

  • 1應用
  • 2正式定義
    • 2.1DCT-I
    • 2.2DCT-II
    • 2.3DCT-III
    • 2.4DCT-IV
    • 2.5DCT V~VIII
  • 3反變換
  • 4計算
  • 5參考
  • 6外部鏈接

應用

離散余弦變換,尤其是它的第二種類型,經常被信號處理和圖像處理使用,用于對信號和圖像(包括靜止圖像和運動圖像)進行有損數據壓縮。這是由于離散余弦變換具有很強的"能量集中"特性:大多數的自然信號(包括聲音和圖像)的能量都集中在離散余弦變換后的低頻部分,而且當信號具有接近馬爾可夫過程(Markov processes)的統計特性時,離散余弦變換的去相關性接近于K-L變換(Karhunen-Loève變換——它具有最優的去相關性)的性能。

例如,在靜止圖像編碼標準JPEG中,在運動圖像編碼標準MJPEG和MPEG的各個標準中都使用了離散余弦變換。在這些標準制中都使用了二維的第二種類型離散余弦變換,并將結果進行量化之后進行熵編碼。這時對應第二種類型離散余弦變換中的n通常是8,并用該公式對每個8x8塊的每行進行變換,然后每列進行變換。得到的是一個8x8的變換系數矩陣。其中(0,0)位置的元素就是直流分量,矩陣中的其他元素根據其位置表示不同頻率的交流分量。

一個類似的變換, 改進的離散余弦變換被用在高級音頻編碼(AAC for Advanced Audio Coding),Vorbis 和 MP3 音頻壓縮當中。

離散余弦變換也經常被用來使用譜方法來解偏微分方程,這時候離散余弦變換的不同的變量對應著數組兩端不同的奇/偶邊界條件。

正式定義

形式上來看,離散余弦變換一個線性的可逆函數 F:R^n\rightarrow R^n 其中R 是實數集, 或者等價的說一個n \times n 的方陣。離散余弦變換有幾種變形的形式, 它們都是根據下面的某一個公式把n 個實數x_0,\ldots ,x_{n-1} 變換到另外n個實數f_0,\ldots ,f_{n-1} 的操作。

DCT-I

f_m = \frac{1}{2} (x_0 + (-1)^m x_{n-1})      + \sum_{k=1}^{n-2} x_k \cos \left[\frac{\pi}{n-1} m k \right]

有些人認為應該將 x_0x_{n-1} 乘以\sqrt{2},相應的將f_0f_{n-1} 乘以\frac{1}{\sqrt{2}}。這樣做的結果是這種 DCT-I 矩陣變為了 正交矩陣 (再乘一個系數的話),但是這樣就不能直接和一個實偶離散傅里葉變換對應了。


一個n=5的對實數abcde的DCT-I型變換等價于一個8點的對實數abcdedcb(偶對稱)的DFT變換,結果再除以2(對應的,DCT-II~DCT-IV相對等價的DFT有一個半個抽樣的位移)。需要指出的是,DCT-I不適用于n<2的情況(其它的DCT類型都適用于所有的整數n)。

所以,DCT-I暗示的邊界條件是: x_k 相對于k=0 點偶對稱,并且相對于 k=n-1 點偶對稱; 對f_m 的情況也類似。

DCT-II

f_m =   \sum_{k=0}^{n-1} x_k \cos \left[\frac{\pi}{n} m \left(k+\frac{1}{2}\right) \right]

DCT-II大概是最常用的一種形式,通常直接被稱為DCT。

有些人更進一步的將f_0再乘以\frac{1}{\sqrt{2}}(參見下面的DCT-III型的對應修改)。這將使得DCT-II成為正交矩陣 (再乘一個系數的話),但是這樣就不能直接和一個有半個抽樣位移的實偶離散傅里葉變換對應了。

所以,DCT-II暗示的邊界條件是: x_k 相對于k=-\frac{1}{2} 點偶對稱,并且相對于 k=n-\frac{1}{2} 點偶對稱; 對f_m 相對于m=0 點偶對稱,并且相對于m=n 點奇對稱。

DCT-III

f_m = \frac{1}{2} x_0 +   \sum_{k=1}^{n-1} x_k \cos \left[\frac{\pi}{n} \left(m+\frac{1}{2}\right) k \right]

因為這是DCT-II的逆變換(再乘一個系數的話),這種變形通常被簡單的稱為逆離散余弦變換。

有些人更進一步的將x_0再乘以\sqrt{2}(參見上面的DCT-II型的對應修改),這將使得DCT-III成為正交矩陣 (再乘一個系數的話),但是這樣就不能直接和一個結果有半個抽樣位移的實偶離散傅里葉變換對應了。

所以,DCT-III暗示的邊界條件是: x_k 相對于k=0 點偶對稱,并且相對于 k=n 點奇對稱; 對f_m 相對于m=-\frac{1}{2} 點偶對稱,并且相對于 m=n-\frac{1}{2} 點奇對稱。

DCT-IV

f_m =   \sum_{k=0}^{n-1} x_k \cos \left[\frac{\pi}{n} \left(m+\frac{1}{2}\right) \left(k+\frac{1}{2}\right) \right]

DCT-IV對應的矩陣是正交矩陣 (再乘一個系數的話)。


一種DCT-IV的變形,將不同的變換的數據重疊起來,被稱為改進的離散余弦變換。

DCT-IV暗示的邊界條件是: x_k 相對于k=-\frac{1}{2} 點偶對稱,并且相對于 k=''n''-1/2 點奇對稱;對j 類似。

DCT V~VIII

上面提到的DCT I~IV是和偶數階的實偶DFT對應的。原則上,還有四種DCT變換(Martucci, 1994)是和奇數階的實偶DFT對應的,它們在分母中都有一個''n''+1/2的系數。但是在實際應用中,這幾種變型很少被用到。

最平凡的和奇數階的實偶DFT對應的DCT是1階的DCT (1也是奇數),可以說變換只是乘上一個系數a而已,對應于DCT-V的長度為1的狀況。

反變換

DCT-I的反變換是把DCT-I乘以系數\frac{1}{n-1}。 DCT-IV的反變換是把DCT-IV乘以系數\frac{2}{n}。 DCT-II的反變換是把DCT-III乘以系數\frac{2}{n},反之亦然。

和離散傅里葉變換類似,變化前面的歸一化系數僅僅是常規而已,改變這個系數并不改變變換的性質。例如,有些人喜歡在DCT-II變換的前面乘以\sqrt{\frac{2}{n}},這樣反變換從形式上就和變換更相似,而不需要另外的歸一化系數。

計算

盡管直接使用公式進行變換需要進行O(n^2)次操作,但是和快速傅里葉變換類似,我們有復雜度為O(n \log(n))的快速算法,這就是常常被稱做蝶形變換的一種分解算法。另外一種方法是通過快速傅里葉變換來計算DCT,這時候需要O(n)的預操作和后操作。

參考

  • K. R. Rao and P. Yip, 離散余弦變換?: 算法、優點和應用 (Discrete Cosine Transform: Algorithms, Advantages, Applications) (Academic Press, Boston, 1990).
  • A. V. Oppenheim, R. W. Schafer, and J. R. Buck, 時間離散信號處理 (Discrete-Time Signal Processing), second edition (Prentice-Hall, New Jersey, 1999).
  • S. A. Martucci, 對稱卷積和離散正弦余弦變換 (Symmetric convolution and the discrete sine and cosine transforms),IEEE Trans. Sig. Processing SP-42, 1038-1051 (1994).
  • Matteo Frigo and Steven G. Johnson: FFTW, http://www.fftw.org/. 一個免費的C語言庫GPL,可以計算DCT-I~IV的1維到多維的任意大小的變換
  • M. Frigo and S. G. Johnson, "FFTW3的設計和實現,"Proceedings of the IEEE 93 (2), 216–231 (2005).

目錄

  • 1應用
  • 2正式定義
    • 2.1DCT-I
    • 2.2DCT-II
    • 2.3DCT-III
    • 2.4DCT-IV
    • 2.5DCT V~VIII
  • 3反變換
  • 4計算
  • 5參考
  • 6外部鏈接

應用

離散余弦變換,尤其是它的第二種類型,經常被信號處理和圖像處理使用,用于對信號和圖像(包括靜止圖像和運動圖像)進行有損數據壓縮。這是由于離散余弦變換具有很強的"能量集中"特性:大多數的自然信號(包括聲音和圖像)的能量都集中在離散余弦變換后的低頻部分,而且當信號具有接近馬爾可夫過程(Markov processes)的統計特性時,離散余弦變換的去相關性接近于K-L變換(Karhunen-Loève變換——它具有最優的去相關性)的性能。

例如,在靜止圖像編碼標準JPEG中,在運動圖像編碼標準MJPEG和MPEG的各個標準中都使用了離散余弦變換。在這些標準制中都使用了二維的第二種類型離散余弦變換,并將結果進行量化之后進行熵編碼。這時對應第二種類型離散余弦變換中的n通常是8,并用該公式對每個8x8塊的每行進行變換,然后每列進行變換。得到的是一個8x8的變換系數矩陣。其中(0,0)位置的元素就是直流分量,矩陣中的其他元素根據其位置表示不同頻率的交流分量。

一個類似的變換, 改進的離散余弦變換被用在高級音頻編碼(AAC for Advanced Audio Coding),Vorbis 和 MP3 音頻壓縮當中。

離散余弦變換也經常被用來使用譜方法來解偏微分方程,這時候離散余弦變換的不同的變量對應著數組兩端不同的奇/偶邊界條件。

正式定義

形式上來看,離散余弦變換一個線性的可逆函數 F:R^n\rightarrow R^n 其中R 是實數集, 或者等價的說一個n \times n 的方陣。離散余弦變換有幾種變形的形式, 它們都是根據下面的某一個公式把n 個實數x_0,\ldots ,x_{n-1} 變換到另外n個實數f_0,\ldots ,f_{n-1} 的操作。

DCT-I

f_m = \frac{1}{2} (x_0 + (-1)^m x_{n-1})      + \sum_{k=1}^{n-2} x_k \cos \left[\frac{\pi}{n-1} m k \right]

有些人認為應該將 x_0x_{n-1} 乘以\sqrt{2},相應的將f_0f_{n-1} 乘以\frac{1}{\sqrt{2}}。這樣做的結果是這種 DCT-I 矩陣變為了 正交矩陣 (再乘一個系數的話),但是這樣就不能直接和一個實偶離散傅里葉變換對應了。


一個n=5的對實數abcde的DCT-I型變換等價于一個8點的對實數abcdedcb(偶對稱)的DFT變換,結果再除以2(對應的,DCT-II~DCT-IV相對等價的DFT有一個半個抽樣的位移)。需要指出的是,DCT-I不適用于n<2的情況(其它的DCT類型都適用于所有的整數n)。

所以,DCT-I暗示的邊界條件是: x_k 相對于k=0 點偶對稱,并且相對于 k=n-1 點偶對稱; 對f_m 的情況也類似。

DCT-II

f_m =   \sum_{k=0}^{n-1} x_k \cos \left[\frac{\pi}{n} m \left(k+\frac{1}{2}\right) \right]

DCT-II大概是最常用的一種形式,通常直接被稱為DCT。

有些人更進一步的將f_0再乘以\frac{1}{\sqrt{2}}(參見下面的DCT-III型的對應修改)。這將使得DCT-II成為正交矩陣 (再乘一個系數的話),但是這樣就不能直接和一個有半個抽樣位移的實偶離散傅里葉變換對應了。

所以,DCT-II暗示的邊界條件是: x_k 相對于k=-\frac{1}{2} 點偶對稱,并且相對于 k=n-\frac{1}{2} 點偶對稱; 對f_m 相對于m=0 點偶對稱,并且相對于m=n 點奇對稱。

DCT-III

f_m = \frac{1}{2} x_0 +   \sum_{k=1}^{n-1} x_k \cos \left[\frac{\pi}{n} \left(m+\frac{1}{2}\right) k \right]

因為這是DCT-II的逆變換(再乘一個系數的話),這種變形通常被簡單的稱為逆離散余弦變換。

有些人更進一步的將x_0再乘以\sqrt{2}(參見上面的DCT-II型的對應修改),這將使得DCT-III成為正交矩陣 (再乘一個系數的話),但是這樣就不能直接和一個結果有半個抽樣位移的實偶離散傅里葉變換對應了。

所以,DCT-III暗示的邊界條件是: x_k 相對于k=0 點偶對稱,并且相對于 k=n 點奇對稱; 對f_m 相對于m=-\frac{1}{2} 點偶對稱,并且相對于 m=n-\frac{1}{2} 點奇對稱。

DCT-IV

f_m =   \sum_{k=0}^{n-1} x_k \cos \left[\frac{\pi}{n} \left(m+\frac{1}{2}\right) \left(k+\frac{1}{2}\right) \right]

DCT-IV對應的矩陣是正交矩陣 (再乘一個系數的話)。


一種DCT-IV的變形,將不同的變換的數據重疊起來,被稱為改進的離散余弦變換。

DCT-IV暗示的邊界條件是: x_k 相對于k=-\frac{1}{2} 點偶對稱,并且相對于 k=''n''-1/2 點奇對稱;對j 類似。

DCT V~VIII

上面提到的DCT I~IV是和偶數階的實偶DFT對應的。原則上,還有四種DCT變換(Martucci, 1994)是和奇數階的實偶DFT對應的,它們在分母中都有一個''n''+1/2的系數。但是在實際應用中,這幾種變型很少被用到。

最平凡的和奇數階的實偶DFT對應的DCT是1階的DCT (1也是奇數),可以說變換只是乘上一個系數a而已,對應于DCT-V的長度為1的狀況。

反變換

DCT-I的反變換是把DCT-I乘以系數\frac{1}{n-1}。 DCT-IV的反變換是把DCT-IV乘以系數\frac{2}{n}。 DCT-II的反變換是把DCT-III乘以系數\frac{2}{n},反之亦然。

和離散傅里葉變換類似,變化前面的歸一化系數僅僅是常規而已,改變這個系數并不改變變換的性質。例如,有些人喜歡在DCT-II變換的前面乘以\sqrt{\frac{2}{n}},這樣反變換從形式上就和變換更相似,而不需要另外的歸一化系數。

計算

盡管直接使用公式進行變換需要進行O(n^2)次操作,但是和快速傅里葉變換類似,我們有復雜度為O(n \log(n))的快速算法,這就是常常被稱做蝶形變換的一種分解算法。另外一種方法是通過快速傅里葉變換來計算DCT,這時候需要O(n)的預操作和后操作。

參考

  • K. R. Rao and P. Yip, 離散余弦變換?: 算法、優點和應用 (Discrete Cosine Transform: Algorithms, Advantages, Applications) (Academic Press, Boston, 1990).
  • A. V. Oppenheim, R. W. Schafer, and J. R. Buck, 時間離散信號處理 (Discrete-Time Signal Processing), second edition (Prentice-Hall, New Jersey, 1999).
  • S. A. Martucci, 對稱卷積和離散正弦余弦變換 (Symmetric convolution and the discrete sine and cosine transforms),IEEE Trans. Sig. Processing SP-42, 1038-1051 (1994).
  • Matteo Frigo and Steven G. Johnson: FFTW, http://www.fftw.org/. 一個免費的C語言庫GPL,可以計算DCT-I~IV的1維到多維的任意大小的變換
  • M. Frigo and S. G. Johnson, "FFTW3的設計和實現,"Proceedings of the IEEE 93 (2), 216–231 (2005).


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

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

相關文章

從源碼看ConcurrentHashMap

簡介 ConcurrentHashMap是線程安全的HashMap實現&#xff0c;這里主要研究JDK8后的ConcurrentHashMap&#xff0c;下面是ConcurrentHashMap的簡單結構&#xff1a; ConcurrentHashMap基于HashMap的基本邏輯&#xff0c;通過CAS synchronized 來保證并發安全性。ConcurrentHas…

代碼重構的方法

見&#xff1a;http://blog.csdn.net/u011889786/article/details/51865344 見&#xff1a;http://blog.csdn.net/weiky626/article/details/1602691 一.提取子函數 說白了就是一個大函數里&#xff0c;可以根據不同功能分成幾個小函數&#xff0c;因為說不定&#xff0c;其他…

android 去掉標題欄、狀態欄、橫屏

// 去掉標題欄supportRequestWindowFeature(Window.FEATURE_NO_TITLE);// 全屏、隱藏狀態欄getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);// 橫屏setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION…

Spring Boot 整合Mybatis (一)

2019獨角獸企業重金招聘Python工程師標準>>> 新建spring-boot項目&#xff0c;相關依賴 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency><de…

x264 的 cache詳解

在這里和下一級別的分析中有必要先講一下這個h->mb.cache&#xff08;沒法講&#xff0c;就是cache!&#xff09;。 x264_macroblock_cache_load將參考幀中某位置的&#xff08;重建后&#xff09;數據保存進cache&#xff0c;供參考和反復使用。 x264_macroblock_cache_s…

同步/異步阻塞/非阻塞

平時開發中經常會聽大家說到什么同步阻塞、異步非阻塞等等名詞&#xff0c;這里我談下自己對這兩個名詞的理解&#xff0c;僅僅是個人觀點&#xff0c;并不一定正確。 1.阻塞/非阻塞 我認為判定阻塞還是非阻塞&#xff0c;取決于線程所做的操作是否需要將線程掛起等待。 舉個…

Repeater的使用

1.頁面代碼 如果要分頁&#xff0c;那么頁面開頭必須寫&#xff08;<% Register Src"~/Controls/Page.ascx" TagName"Page" TagPrefix"uc1" %>&#xff09; 并且分頁&#xff0c;頁腳<uc1:Page ID"Page2" runat"server&…

springboot 整合 mongodb實現 批量更新數據

現需求&#xff1a;需要批量將1000個數據先查詢在更新到mongodb&#xff08;如果查詢不到數據&#xff0c;則添加數據&#xff09; 1&#xff1a;工具類BathUpdateOptions 1 import org.springframework.data.mongodb.core.query.Query;2 import org.springframework.data.mong…

【開題報告】基于微信小程序的校園資訊平臺的設計與實現

1.選題背景與意義 隨著移動互聯網的快速發展&#xff0c;微信成為了人們日常生活中不可或缺的工具之一。在校園生活中&#xff0c;學生們對于校園資訊的獲取和交流需求也越來越高。然而&#xff0c;傳統的校園資訊發布方式存在信息不及時、傳播范圍有限等問題&#xff0c;無法…

三種Cache寫入方式原理簡介

三種Cache寫入方式原理簡介 在386以上檔次的微機中&#xff0c;為了提高系統效率&#xff0c;普遍采用Cache&#xff08;高速緩沖存儲器&#xff09;&#xff0c;現在的系統甚至可以擁有多級Cache。Cache實際上是位于CPU與DRAM主存儲器之間少量超高速的靜態存儲器&#xff08;S…

Minor GC和Full GC

我們在日常開發中可能經常會聽大家談論GC&#xff0c;但是其實很多人對GC的種類其實并不是很了解&#xff0c;接下來我們簡單介紹下Minor GC和Full GC及他們的區別。 MinorGC&#xff1a; 也可以叫作新生代GC&#xff0c;指的是發生在新生代的垃圾收集動作。因為新生代中對象大…

linux安裝軟件的幾種方法

見&#xff1a;http://blog.csdn.net/u010509774/article/details/50593231 一、rpm包安裝方式步驟&#xff1a; 1、找到相應的軟件包&#xff0c;比如soft.version.rpm&#xff0c;下載到本機某個目錄&#xff1b; 2、打開一個終端&#xff0c;su -成root用戶&#xff1b; …

Android NDK MediaCodec在ijkplayer中的實踐

https://www.jianshu.com/p/41d3147a5e07 從API 21&#xff08;Android 5.0&#xff09;開始Android提供C層的NDK MediaCodec的接口。 Java MediaCodec是對NDK MediaCodec的封裝&#xff0c;ijkplayer硬解通路一直使用的是Java MediaCodec接Surface的方式。 本文的主要內容是&a…

leetcode-49-字母異位詞分組(神奇的哈希)

題目描述&#xff1a; 給定一個字符串數組&#xff0c;將字母異位詞組合在一起。字母異位詞指字母相同&#xff0c;但排列不同的字符串。 示例: 輸入: ["eat", "tea", "tan", "ate", "nat", "bat"], 輸出: [[&quo…

【精心總結】java內存模型和多線程必會知識

內存模型 &#xff08;1&#xff09;java內存模型到底是個啥子東西&#xff1f; java內存模型是java虛擬機規范定義的一種特定模型&#xff0c;用以屏蔽不同硬件和操作系統的內存訪問差異&#xff0c;讓java在不同平臺中能達到一致的內存訪問效果&#xff0c;是在特定的協議下…

工作流 activity 視頻教程 + redis 視頻教程 百度網盤分享地址

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到教程。 云盤下載都沒有密碼&#xff0c;直接下載&#xff0c;解壓有密碼&#xff1a;chongxiangmengxiangjiaoyu&#xff0c; 解壓完成后就可以…

快速解決 GRADLE 項目下載 gradle-*-all.zip 慢的問題

1、首先根據項目中 gradle\wrapper\gradle-wrapper.properties 文件的 distributionUrl 屬性的值 #Tue Feb 06 12:27:20 CET 2018 distributionBaseGRADLE_USER_HOME distributionPathwrapper/dists zipStoreBaseGRADLE_USER_HOME zipStorePathwrapper/dists distributionUrlht…

[Python] 程序結構與控制流

1. 條件語句 if、else與elif語句用于控制條件代碼的執行。條件語句的一般格式如下&#xff1a; if expression:statements elif expression:statements elif expression:statements ... else:statements 如果不需要執行任何操作&#xff0c;可以省略條件語句的else和elif子句。…

webrtc 源碼結構

apiWebRTC 接口層。包括 DataChannel, MediaStream, SDP相關的接口。各瀏覽器都是通過該接口層調用的 WebRTC。call存放的是 WebRTC “呼叫&#xff08;Call&#xff09;” 相關邏輯層的代碼。audio存放音頻網絡邏輯層相關的代碼。音頻數據邏輯上的發送&#xff0c;接收等代碼。…

mysql查詢流程解析及重要知識總結

時光荏苒啊&#xff01;在過兩個月我就工作滿三年了&#xff0c;大學畢業的情景還歷歷在目&#xff0c;而我已經默默的向油膩中年大叔進發了。作為一名苦逼的后端工程師&#xff0c;我搞過一段時間python&#xff0c;現在靠java糊口&#xff0c;但后來才發現&#xff0c;始終不…