哈希表思路圖解和代碼實現

原文鏈接傳送門

哈希表(散列)-Google上機題

看一個實際需求,google公司的一個上機題:

有一個公司,當有新的員工來報道時,要求將該員工的信息加入(id,性別,年齡,住址…),當輸入該員工的id時,要求查找到該員工的 所有信息.

要求: 不使用數據庫,盡量節省內存,速度越快越好=>哈希表(散列)

散列表(Hash table,也叫哈希表),是根據關鍵碼值(Key value)而直接進行訪問的數據結構。也就是說,它通過把關鍵碼值映射到表中一個位置來訪問記錄,以加快查找的速度。這個映射函數叫做散列函數,存放記錄的數組叫做散列表。 15 111 % 15

img

嗶哩嗶哩動畫

img img

嗶哩嗶哩動畫

哈希表就是數組里面存儲鏈表

google公司的一個上機題:

有一個公司,當有新的員工來報道時,要求將該員工的信息加入(id,性別,年齡,名字,住址…),當輸入該員工的id時,要求查找到該員工的 所有信息.

要求:

不使用數據庫,速度越快越好=>哈希表(散列) 添加時,保證按照id從低到高插入 [課后思考:如果id不是從低到高插入,但要求各條鏈表仍是從低到高,怎么解決?]

  1. 使用鏈表來實現哈希表, 該鏈表不帶表頭[即: 鏈表的第一個結點就存放雇員信息]
  2. 思路分析并畫出示意圖
  3. 代碼實現[增刪改查(顯示所有員工,按id查詢)]

// 哈希表之所以能夠提高效率,是因為他能夠同時管理多個鏈表

Emp

/*** 表示一個雇員*/
class Emp{public int id;public String name;public Emp next;//next 默認為空public Emp(int id, String name) {this.id = id;this.name = name;}
}

HashTab

///創建hashTab 管理多條鏈表class HashTab{// 數組里面放的是鏈表private EmpLinkedList[] empLinkedListArray;//private Integer size = 7;// 構造器public HashTab(int size) {// 初始化empLinkedListArrayempLinkedListArray = new EmpLinkedList[size];// ? 留一個坑// 這里能直接用么/** add:添加雇員list:顯示雇員exit:退出雇員add輸入idtomException in thread "main" java.util.InputMismatchExceptionat java.util.Scanner.throwFor(Scanner.java:864)at java.util.Scanner.next(Scanner.java:1485)at java.util.Scanner.nextInt(Scanner.java:2117)at java.util.Scanner.nextInt(Scanner.java:2076)at com.atguigu.hashtab.HashTabDemo.main(HashTabDemo.java:30)Process finished with exit code 1* */// 這個時候不要忘了, 分別初始化 每個鏈表for (int i = 0; i < size; i++) {// 數組中的每一個元素都需要創建一把empLinkedListArray[i] = new EmpLinkedList();}}// 添加雇員public void add(Emp emp) {// 根據員工的id,得到該員工應當加入到,哪條鏈表int empLinkedListNO = hashFun(emp.id);// 將emp 添加到對應的鏈表中empLinkedListArray[empLinkedListNO].add(emp);}// 不管你是什么操作,總是要找鏈表// 遍歷所有的鏈表public void list() {// 遍歷Hash表for (int i = 0; i < size; i++) {empLinkedListArray[i].list(i);}}// 編寫一個散列函數// 散列函數有很多種寫法// 這里使用簡單的方法-取模法public int hashFun(int id) {return id % size;}/*** 更根據輸入的id,查找雇員* @param id*/public void findEmpById(int id) {// 使用散列函數確定到哪條鏈表查找int empLinkedListNO = hashFun(id);Emp emp = empLinkedListArray[empLinkedListNO].findEmpById(id);if (emp != null) {// 說明找到了System.out.println("找到了該雇員");System.out.printf("在第%d條鏈表中找到了該雇員,id = %d",id,empLinkedListNO+1);} else {System.out.println("在哈希表中,沒有找到該雇員~");}}
}

EmpLinkedList

class EmpLinkedList{// 頭指針, 執行第一個Emp,因此我們這個鏈表的head,是直接 指向第一個Empprivate Emp head;//添加雇員到鏈表// 說明.// 1. 假定,當添加雇員的時候,id是自增長的,即id 的分配總是從小到大public void add(Emp emp) {// 如果是添加第一個雇員if (head == null) {head = emp;return;}// 如果不是添加第一個雇員,則使用一個輔助的指針,幫助定位到最后Emp currEmp = head;while (true) {if (currEmp.next == null) {// 說明到鏈表最后break;}// 后移currEmp = currEmp.next;}// 退出時,直接將emp 加入鏈表currEmp.next = emp;}// 遍歷鏈表的雇員信息public void list(int no) {// 判斷是否為空if (head == null) {// 說明鏈表為空System.out.println("當前鏈"+no+"表為空!");return;}// 沒有空
//        打印信息System.out.println("當前鏈"+no+"表的信息為");// 輔助指針Emp currEmp = head;while (true) {System.out.printf("=> id =%d name = %s\t",currEmp.id,currEmp.name);if (currEmp.next == null) {// 說明,currEmp 已經是最后節點break;}// 后移 遍歷currEmp = currEmp.next;}System.out.println();}/***     // 根據id 查找雇員*    // 如果查找到 ,就返回Emp,如果沒有找打到,就返回null* @param id* @return*/public Emp findEmpById(int id) {// 判斷鏈表是否為空if (head == null) {System.out.println("鏈表為空");return null;}//輔助指針Emp curEmp = head;while (true) {//if (curEmp.id == id) {// 找到break;//  這個時候,currEmp就指向了要查找的雇員}// 退出if (curEmp.next == null) {// 說明遍歷當前鏈表沒有找到該雇員curEmp = null;}// 后移curEmp = curEmp.next;}return curEmp;}
}

主函數

public static void main(String[] args) {// 創建哈希表HashTab hashTab = new HashTab(7);// 寫一個簡單的菜單來測試String key = "";Scanner scanner = new Scanner(System.in);while (true) {System.out.println("add:添加雇員");System.out.println("list:顯示雇員");System.out.println("find:查找雇員");System.out.println("exit:退出雇員");key = scanner.next();switch (key) {case "add":System.out.println("輸入id");int id = scanner.nextInt();System.out.println("輸入名字");String name = scanner.next();// 創建雇員Emp emp = new Emp(id, name);hashTab.add(emp);break;case "list":hashTab.list();break;case "find":System.out.println("輸入id");int findId = scanner.nextInt();hashTab.findEmpById(findId);break;case "exit":scanner.close();System.exit(0);default:break;}}
}
add:添加雇員
list:顯示雇員
find:查找雇員
exit:退出雇員
add
輸入id
1
輸入名字
tom
add:添加雇員
list:顯示雇員
find:查找雇員
exit:退出雇員
add
輸入id
2
輸入名字
jack
add:添加雇員
list:顯示雇員
find:查找雇員
exit:退出雇員
add
輸入id
3
輸入名字
pin
add:添加雇員
list:顯示雇員
find:查找雇員
exit:退出雇員
add
輸入id
6
輸入名字
nanc
add:添加雇員
list:顯示雇員
find:查找雇員
exit:退出雇員
list
當前鏈0表為空!
當前鏈1表的信息為
=> id =1 name = tom	
當前鏈2表的信息為
=> id =2 name = jack	
當前鏈3表的信息為
=> id =3 name = pin	
當前鏈4表為空!
當前鏈5表為空!
當前鏈6表的信息為
=> id =6 name = nanc	
add:添加雇員
list:顯示雇員
find:查找雇員
exit:退出雇員
add
輸入id
123
輸入名字
sme
add:添加雇員
list:顯示雇員
find:查找雇員
exit:退出雇員
list
當前鏈0表為空!
當前鏈1表的信息為
=> id =1 name = tom	
當前鏈2表的信息為
=> id =2 name = jack	
當前鏈3表的信息為
=> id =3 name = pin	
當前鏈4表的信息為
=> id =123 name = sme	
當前鏈5表為空!
當前鏈6表的信息為
=> id =6 name = nanc	
add:添加雇員
list:顯示雇員
find:查找雇員
exit:退出雇員
add
輸入id
678
輸入名字
vicr
add:添加雇員
list:顯示雇員
find:查找雇員
exit:退出雇員
list
當前鏈0表為空!
當前鏈1表的信息為
=> id =1 name = tom	
當前鏈2表的信息為
=> id =2 name = jack	
當前鏈3表的信息為
=> id =3 name = pin	
當前鏈4表的信息為
=> id =123 name = sme	
當前鏈5表為空!
當前鏈6表的信息為
=> id =6 name = nanc	=> id =678 name = vicr	
add:添加雇員
list:顯示雇員
find:查找雇員
exit:退出雇員
add
輸入id
389
輸入名字
wef
add:添加雇員
list:顯示雇員
find:查找雇員
exit:退出雇員
add
輸入id
9
輸入名字
zho
add:添加雇員
list:顯示雇員
find:查找雇員
exit:退出雇員
list
當前鏈0表為空!
當前鏈1表的信息為
=> id =1 name = tom	
當前鏈2表的信息為
=> id =2 name = jack	=> id =9 name = zho	
當前鏈3表的信息為
=> id =3 name = pin	
當前鏈4表的信息為
=> id =123 name = sme	=> id =389 name = wef	
當前鏈5表為空!
當前鏈6表的信息為
=> id =6 name = nanc	=> id =678 name = vicr	
add:添加雇員
list:顯示雇員
find:查找雇員
exit:退出雇員
add
輸入id
34
輸入名字
mach
add:添加雇員
list:顯示雇員
find:查找雇員
exit:退出雇員
list
當前鏈0表為空!
當前鏈1表的信息為
=> id =1 name = tom	
當前鏈2表的信息為
=> id =2 name = jack	=> id =9 name = zho	
當前鏈3表的信息為
=> id =3 name = pin	
當前鏈4表的信息為
=> id =123 name = sme	=> id =389 name = wef	
當前鏈5表為空!
當前鏈6表的信息為
=> id =6 name = nanc	=> id =678 name = vicr	=> id =34 name = mach	
add:添加雇員
list:顯示雇員
find:查找雇員
exit:退出雇員
find
輸入id
8
Exception in thread "main" java.lang.NullPointerExceptionat com.atguigu.hashtab.EmpLinkedList.findEmpById(HashTabDemo.java:237)at com.atguigu.hashtab.HashTab.findEmpById(HashTabDemo.java:128)at com.atguigu.hashtab.HashTabDemo.main(HashTabDemo.java:44)Process finished with exit code 1

最后這里置空要 加上break

if (curEmp.next == null) {// 說明遍歷當前鏈表沒有找到該雇員curEmp = null;break;}

這下就可以了

add:添加雇員
list:顯示雇員
find:查找雇員
exit:退出雇員
add
輸入id
1
輸入名字
tom
add:添加雇員
list:顯示雇員
find:查找雇員
exit:退出雇員
add
輸入id
2
輸入名字
nancy
add:添加雇員
list:顯示雇員
find:查找雇員
exit:退出雇員
add4
add:添加雇員
list:顯示雇員
find:查找雇員
exit:退出雇員
add
輸入id
4
輸入名字
victor
add:添加雇員
list:顯示雇員
find:查找雇員
exit:退出雇員
list
當前鏈0表為空!
當前鏈1表的信息為
=> id =1 name = tom	
當前鏈2表的信息為
=> id =2 name = nancy	
當前鏈3表為空!
當前鏈4表的信息為
=> id =4 name = victor	
當前鏈5表為空!
當前鏈6表為空!
add:添加雇員
list:顯示雇員
find:查找雇員
exit:退出雇員
find
輸入id
6
鏈表為空
在哈希表中,沒有找到該雇員~
add:添加雇員
list:顯示雇員
find:查找雇員
exit:退出雇員
find
輸入id
4
找到了該雇員
在第4條鏈表中找到了該雇員,id = 5add:添加雇員
list:顯示雇員
find:查找雇員
exit:退出雇員

完整代碼

package com.atguigu.hashtab;import java.util.Scanner;/*** ClassName:  <br/>* Description:  <br/>* Date: 2021-02-24 13:10 <br/>* <br/>* @project data_algorithm* @package com.atguigu.hashtab*/
public class HashTabDemo {public static void main(String[] args) {// 創建哈希表HashTab hashTab = new HashTab(7);// 寫一個簡單的菜單來測試String key = "";Scanner scanner = new Scanner(System.in);while (true) {System.out.println("add:添加雇員");System.out.println("list:顯示雇員");System.out.println("find:查找雇員");System.out.println("exit:退出雇員");key = scanner.next();switch (key) {case "add":System.out.println("輸入id");int id = scanner.nextInt();System.out.println("輸入名字");String name = scanner.next();// 創建雇員Emp emp = new Emp(id, name);hashTab.add(emp);break;case "list":hashTab.list();break;case "find":System.out.println("輸入id");int findId = scanner.nextInt();hashTab.findEmpById(findId);break;case "exit":scanner.close();System.exit(0);default:break;}}}
}///創建hashTab 管理多條鏈表class HashTab{// 數組里面放的是鏈表private EmpLinkedList[] empLinkedListArray;//private Integer size = 7;// 構造器public HashTab(int size) {// 初始化empLinkedListArrayempLinkedListArray = new EmpLinkedList[size];// ? 留一個坑// 這里能直接用么/** add:添加雇員list:顯示雇員exit:退出雇員add輸入idtomException in thread "main" java.util.InputMismatchExceptionat java.util.Scanner.throwFor(Scanner.java:864)at java.util.Scanner.next(Scanner.java:1485)at java.util.Scanner.nextInt(Scanner.java:2117)at java.util.Scanner.nextInt(Scanner.java:2076)at com.atguigu.hashtab.HashTabDemo.main(HashTabDemo.java:30)Process finished with exit code 1* */// 這個時候不要忘了, 分別初始化 每個鏈表for (int i = 0; i < size; i++) {// 數組中的每一個元素都需要創建一把empLinkedListArray[i] = new EmpLinkedList();}}// 添加雇員public void add(Emp emp) {// 根據員工的id,得到該員工應當加入到,哪條鏈表int empLinkedListNO = hashFun(emp.id);// 將emp 添加到對應的鏈表中empLinkedListArray[empLinkedListNO].add(emp);}// 不管你是什么操作,總是要找鏈表// 遍歷所有的鏈表public void list() {// 遍歷Hash表for (int i = 0; i < size; i++) {empLinkedListArray[i].list(i);}}// 編寫一個散列函數// 散列函數有很多種寫法// 這里使用簡單的方法-取模法public int hashFun(int id) {return id % size;}/*** 更根據輸入的id,查找雇員* @param id*/public void findEmpById(int id) {// 使用散列函數確定到哪條鏈表查找int empLinkedListNO = hashFun(id);Emp emp = empLinkedListArray[empLinkedListNO].findEmpById(id);if (emp != null) {// 說明找到了System.out.println("找到了該雇員");System.out.printf("在第%d條鏈表中找到了該雇員,id = %d",id,empLinkedListNO+1);} else {System.out.println("在哈希表中,沒有找到該雇員~");}}
}/*** 表示一個雇員*/
class Emp{public int id;public String name;public Emp next;//next 默認為空public Emp(int id, String name) {this.id = id;this.name = name;}
}class EmpLinkedList{// 頭指針, 執行第一個Emp,因此我們這個鏈表的head,是直接 指向第一個Empprivate Emp head;//添加雇員到鏈表// 說明.// 1. 假定,當添加雇員的時候,id是自增長的,即id 的分配總是從小到大public void add(Emp emp) {// 如果是添加第一個雇員if (head == null) {head = emp;return;}// 如果不是添加第一個雇員,則使用一個輔助的指針,幫助定位到最后Emp currEmp = head;while (true) {if (currEmp.next == null) {// 說明到鏈表最后break;}// 后移currEmp = currEmp.next;}// 退出時,直接將emp 加入鏈表currEmp.next = emp;}// 遍歷鏈表的雇員信息public void list(int no) {// 判斷是否為空if (head == null) {// 說明鏈表為空System.out.println("當前鏈"+no+"表為空!");return;}// 沒有空
//        打印信息System.out.println("當前鏈"+no+"表的信息為");// 輔助指針Emp currEmp = head;while (true) {System.out.printf("=> id =%d name = %s\t",currEmp.id,currEmp.name);if (currEmp.next == null) {// 說明,currEmp 已經是最后節點break;}// 后移 遍歷currEmp = currEmp.next;}System.out.println();}/***     // 根據id 查找雇員*    // 如果查找到 ,就返回Emp,如果沒有找打到,就返回null* @param id* @return*/public Emp findEmpById(int id) {// 判斷鏈表是否為空if (head == null) {System.out.println("鏈表為空");return null;}//輔助指針Emp curEmp = head;while (true) {//if (curEmp.id == id) {// 找到break;//  這個時候,currEmp就指向了要查找的雇員}// 退出if (curEmp.next == null) {// 說明遍歷當前鏈表沒有找到該雇員curEmp = null;break;}// 后移curEmp = curEmp.next;}return curEmp;}
}

擴展

刪除功能???

原文鏈接傳送門

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

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

相關文章

android開發學習——Mina框架

Apache Mina Server 是一個網絡通信應用框架&#xff0c;對socket進行了封裝。 http://www.cnblogs.com/moonandstar08/p/5475766.html http://blog.csdn.net/u010739551/article/details/47361365 http://www.cnblogs.com/yanghuiping/p/4108063.html &#xff08;mina 自定…

glibc交叉編譯_TSN之linuxptp交叉編譯

0 開發環境1 linuxptp是什么2 為什么要交叉編譯linuxptp3 修改makefile4 修改源碼5 交叉編譯0 開發環境筆記本&#xff1a;ubuntu18.04.5&#xff0c;內核版本為5.3 開發板&#xff1a;imx8mp-evk內核版本&#xff1a;Linux5.4.24交叉編譯工具鏈&#xff1a;fsl-imx-xwayland-g…

230. Kth Smallest Element in a BST

題目&#xff1a; Given a binary search tree, write a function kthSmallest to find the kth smallest element in it. Note: You may assume k is always valid, 1 ≤ k ≤ BSTs total elements. Follow up:What if the BST is modified (insert/delete operations) often …

聲音編碼

1.脈沖編碼調制PCM文件格式簡介 將音頻數字化&#xff0c;其實就是將聲音數字化。最常見的方式是透過脈沖編碼調制PCM(Pulse Code Modulation) 。運作原理如下。首先我們考慮聲音經過麥克風&#xff0c;轉換成一連串電壓變化的信號&#xff0c;如圖一所示。這張圖的橫座標為秒&…

Elastic Stack簡介

Elastic Stack簡介 如果你沒有聽說過Elastic Stack&#xff0c;那你一定聽說過ELK&#xff0c;實際上ELK是三款軟件的簡稱&#xff0c;分別是Elasticsearch、 Logstash、Kibana組成&#xff0c;在發展的過程中&#xff0c;又有新成員Beats的加入&#xff0c;所以就形成了Elast…

webpack v3 結合 react-router v4 做 dynamic import — 按需加載(懶加載)

為什么要做dynamic import&#xff1f; dynamic import不知道為什么有很多叫法&#xff0c;什么按需加載&#xff0c;懶加載&#xff0c;Code Splitting&#xff0c;代碼分頁等。總之&#xff0c;就是在SPA&#xff0c;把JS代碼分成N個頁面份數的文件&#xff0c;不在用戶剛進來…

go kegg_工具篇丨GO和KEGG富集不到通路?快試試這個超贊的功能分析工具吧

GO和KEGG富集分析是我們在篩選出差異表達基因之后&#xff0c;都會去做的套路性分析。然鵝……我相信&#xff0c;總有那么一些“倒霉孩子”會遇到跟我一樣的窘境吧&#xff0c;好不容易篩選出來的差異基因&#xff0c;嘗試了DAVID(https://david.ncifcrf.gov/)、Metascape(htt…

大齡程序員的未來在何方

來源&#xff1a;http://www.gad.qq.com//article/detail/30358?sessionUserTypeBFT.PARAMS.229862.TASKID&ADUIN114328649&ADSESSION1501026740&ADTAGCLIENT.QQ.5533_.0&ADPUBNO26719 作者&#xff1a;foruok 大家都對大齡技術人員的未來非常關心&#xff0c…

搭建Telnet服務器

搭建Telnet服務器 作者&#xff1a;尹正杰 版權聲明&#xff1a;原創作品&#xff0c;謝絕轉載&#xff01;否則將追究法律責任。 可能大家都知道現在已經很少有人用TELNET服務器&#xff0c; 因為它傳輸數據是以明文的方式&#xff0c;我們很容易通過抓包軟件講數據進行抓包&a…

table取tr對象 vue_Vue筆記

Vue集成了React和Angular的優點&#xff0c;摒棄了他們的缺點。Vue的官網&#xff1a;https://cn.vuejs.org/v2/api/Vue誕生于2016年&#xff0c;是現在非常流行的MVVM框架。Vue提供了“引包”的使用方法&#xff0c;初學者可以在這之下學習語法。不需要webpack&#xff0c;不需…

Beats入門簡介

使用Beat收集nginx日志和指標數據 項目需求 Nginx是一款非常優秀的web服務器&#xff0c;往往nginx服務會作為項目的訪問入口&#xff0c;那么&#xff0c;nginx的性能保障就變得非常重要了&#xff0c;如果nginx的運行出現了問題就會對項目有較大的影響&#xff0c;所以&…

PHP-curl

//初始化$curl curl_init();//設置抓取的urlcurl_setopt($curl, CURLOPT_URL, http://www.baidu.com);//設置頭文件的信息作為數據流輸出curl_setopt($curl, CURLOPT_HEADER, 1);//設置獲取的信息以文件流的形式返回&#xff0c;而不是直接輸出。curl_setopt($curl, CURLOPT_R…

MPlayer開發

一、介紹 不論是音頻數據還是視頻數據&#xff0c;我都為MPlayer項目開發過一些開源的解碼器。因此我個人認為我有資格寫一篇文檔來介紹如何開發新的編解碼器。 學習如何添加一個新的編解碼器的最好方法通常是學習大量的已有代碼。本文檔僅僅是對代碼的一個補充&#x…

可編程led燈帶原理_SCPSD-250-04-27派克真空壓力傳感器故障和工作原理

SCPSD-250-04-27派克PARKER真空壓力傳感器故障和工作原理PARKER壓力開關現貨 PARKER壓力傳感器特價 派克真空壓力傳感器 PARKER數字壓力開關2020年還剩最后2天了&#xff0c;這一年大家都過得不太容易&#xff0c;尤其是我自己這是30年以來過得最艱難的一年&#xff0c;經…

總結面試時沒有回答上的內存對齊問題

前兩天面試某公司時&#xff0c;沒有回答上的一個問題&#xff0c;總結如下&#xff0c;以供參考。 問&#xff1a;下面這個結構類型的實例變量占用多少內存&#xff1a; struct struct1 { int i; short j; char c; }; 我反問&#xff1a;是啥語言啥機器啥編譯環境…

Kibana入門安裝與介紹

Kibana入門 Kibana 是一款開源的數據分析和可視化平臺&#xff0c;它是 Elastic Stack 成員之一&#xff0c;設計用于和 Elasticsearch 協作。您可以使用 Kibana 對 Elasticsearch 索引中的數據進行搜索、查看、交互操作。您可以很方便的利用圖表、表格及地圖對數據進行多元化…

友善串口工具接收數據隨機換行_使用Python3+PyQT5+Pyserial 實現簡單的串口工具方法...

練手項目&#xff0c;先上圖先實現一個簡單的串口工具&#xff0c;為之后的上位機做準備代碼如下&#xff1a;pyserial_demo.pyimport sys import serial import serial.tools.list_ports from PyQt5 import QtWidgets from PyQt5.QtWidgets import QMessageBox from PyQt5.QtC…

Vue渲染函數

前面的話 Vue 推薦在絕大多數情況下使用 template 來創建HTML。然而在一些場景中&#xff0c;真的需要 JavaScript 的完全編程的能力&#xff0c;這就是 render 函數&#xff0c;它比 template 更接近編譯器。本文將詳細介紹Vue渲染函數 引入 下面是一個例子&#xff0c;如果要…

數據綁定原理

一、數據單向綁定原理指先把模板寫好&#xff0c;然后把模板和數據(數據可能來自后臺)整合到一起形成HTML代碼&#xff0c;最后把這段HTML代碼插入到文檔流里。缺點&#xff1a;一旦HTML代碼生成就沒有辦法改變&#xff0c;如果有新數據重新傳入&#xff0c;就必須重新把模板和…

視頻解碼優化

以下通過剖析一些經驗來了解視頻解碼優化 1. 在嵌入式系統中實現MPEG4的視頻解碼 有兩種方法可行 (1)采用ffmpeg(mplayer 的核心就是采用ffmpeg)&#xff0c;然后對ffmpeg mp4解碼優化 1).對IDCT匯編化,并優化VLD的實現 ->inline&匯編化 2).根據ARM9 cache&cache…