淺談線性表的原理及簡(jiǎn)單實(shí)現(xiàn)方法
一、線性表
原理:零個(gè)或多個(gè)同類(lèi)數(shù)據(jù)元素的有限序列
原理圖:
特點(diǎn) :
1、有序性
2、有限性
3、同類(lèi)型元素
4、第一個(gè)元素?zé)o前驅(qū),最后一個(gè)元素?zé)o后繼,中間的元素有一個(gè)前驅(qū)并且有一個(gè)后繼
線性表是一種邏輯上的數(shù)據(jù)結(jié)構(gòu),在物理上一般有兩種實(shí)現(xiàn) 順序?qū)崿F(xiàn)和鏈表實(shí)現(xiàn)
二、基于數(shù)組的 線性表順序?qū)崿F(xiàn)
原理 : 用一段地址連續(xù)的存儲(chǔ)單元依次存儲(chǔ)線性表數(shù)據(jù)元素。
原理圖:
算法原理:
1、初始化一個(gè)定長(zhǎng)的數(shù)組空間 elementData[] , size 存儲(chǔ)長(zhǎng)度 存儲(chǔ)元素
2、通過(guò)索引來(lái)快速存取元素
3、通過(guò)數(shù)組復(fù)制實(shí)現(xiàn)元素的插入和刪除
總結(jié):
1、無(wú)需為表示表中元素之間的邏輯關(guān)系增加額外的存儲(chǔ)空間
2、可以快速存取表中任一位置元素
3、插入和刪除需要進(jìn)行數(shù)組復(fù)制(即大量元素的移動(dòng))
4、線性表長(zhǎng)度變化較大時(shí),需要頻繁擴(kuò)容,并造成存儲(chǔ)空間碎片
實(shí)現(xiàn)代碼:
接口定義:
package online.jfree.base; /** * author : Guo LiXiao * date : 2017-6-14 11:46 */ public interface LineList <E>{ /** * lineList 是否為空 * @return */ boolean isEmpty(); /** * 清空 lineList */ void clear(); /** * 獲取指定位置元素 * @param index * @return */ E get(int index); /** * 獲取元素第一次出現(xiàn)的位置 * @param e * @return */ int indexOf(E e); /** * 判斷 lineList是否包含指定元素 * @param e * @return */ boolean contains(E e); /** * 設(shè)置指定位置數(shù)據(jù),如數(shù)據(jù)已存在 則覆蓋原數(shù)據(jù) * @param index * @param e * @return */ E set(int index, E e); /** * 移除指定位置元素 * @param index * @return */ E remove(int index); /** * 在lineList結(jié)尾插入元素 * @param e * @return */ E add(E e); /** * 在index后面插入元素 * @param index * @param e * @return */ E add(int index, E e); /** * 返回lineList長(zhǎng)度 * @return */ int size(); }
算法實(shí)現(xiàn):
package online.jfree.base; /** * author : Guo LiXiao * date : 2017-6-15 13:44 */ public class OrderedLineList<E> implements LineList<E> { private static final int INIT_CAPACITY = 10; private transient E[] elementData; private transient int elementLength; private int size; public OrderedLineList() { this(0); } public OrderedLineList(int initCapacity) { init(initCapacity); } private void init(int initCapacity) { if (initCapacity >= 0) { this.elementData = (E[]) new Object[initCapacity]; this.elementLength = initCapacity; } else { throw new IllegalArgumentException("Illegal Capacity: " + initCapacity); } this.size = 0; } /** * 擴(kuò)容 */ private void dilatation() { int oldCapacity = this.elementLength; int newCapacity = oldCapacity; if (oldCapacity <= this.size) { newCapacity = oldCapacity + INIT_CAPACITY; }else if(oldCapacity - INIT_CAPACITY > this.size){ newCapacity = oldCapacity - INIT_CAPACITY; } if (oldCapacity != newCapacity){ E[] newElementData = (E[]) new Object[newCapacity]; System.arraycopy(elementData, 0, newElementData, 0, oldCapacity); this.elementLength = newCapacity; this.elementData = newElementData; } } /** * 校驗(yàn)列表索引越界 * @param index */ private void checkCapacity(int index){ if (index > this.size - 1 || index < 0) throw new IndexOutOfBoundsException(new StringBuffer("[index : ").append(index).append("] , [size : ").append(size).append("] ").toString()); } @Override public boolean isEmpty() { return this.size == 0; } @Override public void clear() { this.init(0); } @Override public E get(int index) { this.checkCapacity(index); return this.elementData[index]; } @Override public int indexOf(E e) { for (int i = 0; i < this.size; i++){ if (e == null && elementData[i] == null || e.equals(elementData[i])){ return i; } } return -1; } @Override public boolean contains(E e) { return this.indexOf(e) > 0; } @Override public E set(int index, E e) { this.checkCapacity(index); this.dilatation(); E oldElement = this.elementData[index]; this.elementData[index] = e; return oldElement; } @Override public E remove(int index) { this.dilatation(); E e = elementData[index]; if (index == size - 1) elementData[index] = null; else { int length = size - index - 1; System.arraycopy(elementData, index + 1, elementData, index, length); } size --; return e; } @Override public E add(E e) { return this.add(size, e); } @Override public E add(int index, E e) { this.dilatation(); if (index == size) elementData[index] = e; else { index++; int lastLength = size - index; E[] lastElementData = (E[]) new Object[lastLength]; System.arraycopy(elementData, index, lastElementData, 0, lastLength); elementData[index] = e; System.arraycopy(lastElementData, 0, elementData, index + 1, lastLength); } size ++ ; return e; } @Override public int size() { return this.size; } }
以上這篇淺談線性表的原理及簡(jiǎn)單實(shí)現(xiàn)方法就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
java中Scanner.next()和Scanner.nextLine的區(qū)別圖文詳解
使用java語(yǔ)言編程,最常用的輸入就是使用Scanner了,它的構(gòu)造很簡(jiǎn)單,這篇文章主要給大家介紹了關(guān)于java中Scanner.next()和Scanner.nextLine區(qū)別的相關(guān)資料,需要的朋友可以參考下2024-02-02Java8 Stream Collectors收集器使用方法解析
這篇文章主要介紹了Java8 Stream Collectors收集器使用方法解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08Spring Data JPA實(shí)現(xiàn)排序與分頁(yè)查詢超詳細(xì)流程講解
在介紹Spring Data JPA的時(shí)候,我們首先認(rèn)識(shí)下Hibernate。Hibernate是數(shù)據(jù)訪問(wèn)解決技術(shù)的絕對(duì)霸主,使用O/R映射技術(shù)實(shí)現(xiàn)數(shù)據(jù)訪問(wèn),O/R映射即將領(lǐng)域模型類(lèi)和數(shù)據(jù)庫(kù)的表進(jìn)行映射,通過(guò)程序操作對(duì)象而實(shí)現(xiàn)表數(shù)據(jù)操作的能力,讓數(shù)據(jù)訪問(wèn)操作無(wú)須關(guān)注數(shù)據(jù)庫(kù)相關(guān)的技術(shù)2022-10-10Intellj?idea新建的java源文件夾不是藍(lán)色的圖文解決辦法
idea打開(kāi)java項(xiàng)目后新建的模塊中,java文件夾需要變成藍(lán)色,這篇文章主要給大家介紹了關(guān)于Intellj?idea新建的java源文件夾不是藍(lán)色的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),需要的朋友可以參考下2024-02-02Java數(shù)據(jù)結(jié)構(gòu)之稀疏數(shù)組的實(shí)現(xiàn)與應(yīng)用
這篇文章主要為大家詳細(xì)介紹了Java數(shù)據(jù)結(jié)構(gòu)中稀疏數(shù)組的實(shí)現(xiàn)與應(yīng)用,文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的可以了解一下2022-10-10