亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

Java數據結構之稀疏矩陣定義與用法示例

2024-07-13 10:17:19
字體:
來源:轉載
供稿:網友

本文實例講述了Java數據結構之稀疏矩陣定義與用法。分享給大家供大家參考,具體如下:

稀疏矩陣非零元素的三元組類:

package com.clarck.datastructure.matrix;/** * 稀疏矩陣的壓縮存儲 * * 稀疏矩陣非零元素的三元組類 * * @author clarck * */public class Triple implements Comparable<Triple> {  // 行號,列號, 元素值,默認訪問權限  int row, colum, value;  public Triple(int row, int colum, int value) {    if (row < 0 || colum < 0) {      throw new IllegalArgumentException("稀疏矩陣元素三元組的行/列序號非正數");    }    this.row = row;    this.colum = colum;    this.value = value;  }  /**   * 拷貝構造方法,復制一個三元組   *   * @param elem   */  public Triple(Triple elem) {    this(elem.row, elem.colum, elem.value);  }  @Override  public String toString() {    return "(" + row + ", " + colum + ", " + value + ")";  }  /**   * 兩個三元組是否相等,比較位置和元素值   */  public boolean equals(Object obj) {    if (!(obj instanceof Triple))      return false;    Triple elem = (Triple) obj;    return this.row == elem.row && this.colum == elem.colum        && this.value == elem.value;  }  /**   * 根據三元組位置比較兩個三元組的大小,與元素值無關,約定三元組排序次序   */  @Override  public int compareTo(Triple elem) {    //當前三元組對象小    if (this.row < elem.row || this.row == elem.row && this.colum < elem.colum)      return -1;    //相等,與equals方法含義不同    if (this.row == elem.row && this.colum == elem.colum)      return 0;    //當前三元組對象大    return 1;  }  /**   * 加法, +=運算符作用   * @param term   */  public void add(Triple term) {    if (this.compareTo(term) == 0)      this.value += term.value;    else      throw new IllegalArgumentException("兩項的指數不同,不能相加");  }  /**   * 約定刪除元素   *   * @return   */  public boolean removable() {    //不存儲為0的元素    return this.value == 0;  }  /**   * 返回對稱位置矩陣元素的三元組   * @return   */  public Triple toSymmetry() {    return new Triple(this.colum, this.row, this.value);  }  /**   * 加法運算,重載運算符+   * @return   */  public Triple plus(Triple term) {    Triple tmp = new Triple(this);    tmp.add(term);    return tmp;  }}

三元組順序存儲的稀疏矩陣類:

package com.clarck.datastructure.matrix;import com.clarck.datastructure.linear.SeqList;/** * 稀疏矩陣的壓縮存儲 * * 稀疏矩陣三元組順序表 * * 三元組順序存儲的稀疏矩陣類 * * @author clarck * */public class SeqSparseMatrix {  // 矩陣行數、列數  private int rows, columns;  // 稀疏矩陣三元組順序表  private SeqList<Triple> list;  /**   * 構造rows行,colums列零矩陣   *   * @param rows   * @param columns   */  public SeqSparseMatrix(int rows, int columns) {    if (rows <= 0 || columns <= 0)      throw new IllegalArgumentException("矩陣行數或列數為非正數");    this.rows = rows;    this.columns = columns;    // 構造空順序表,執行SeqList()構造方法    this.list = new SeqList<Triple>();  }  public SeqSparseMatrix(int rows, int columns, Triple[] elems) {    this(rows, columns);    // 按行主序插入一個元素的三元組    for (int i = 0; i < elems.length; i++)      this.set(elems[i]);  }  /**   * 返回矩陣第i行第j列元素,排序順序表的順序查找算法,O(n)   *   * @param i   * @param j   * @return   */  public int get(int i, int j) {    if (i < 0 || i >= rows || j < 0 || j >= columns)      throw new IndexOutOfBoundsException("矩陣元素的行或列序號越界");    Triple item = new Triple(i, j, 0);    int k = 0;    Triple elem = this.list.get(k);    // 在排序順序表list中順序查找item對象    while (k < this.list.length() && item.compareTo(elem) >= 0) {      // 只比較三元組元素位置,即elem.row == i && elem.column == j      if (item.compareTo(elem) == 0)        return elem.value;      // 查找到(i, j), 返回矩陣元素      k++;      elem = this.list.get(k);    }    return 0;  }  /**   * 以三元組設置矩陣元素   *   * @param elem   */  public void set(Triple elem) {    this.set(elem.row, elem.colum, elem.value);  }  /**   * 設置矩陣第row行第column列的元素值為value,按行主序在排序順序表list中更改或插入一個元素的三元組, O(n)   *   * @param row   * @param column   * @param value   */  public void set(int row, int column, int value) {    // 不存儲值為0元素    if (value == 0)      return;    if (row >= this.rows || column >= this.columns)      throw new IllegalArgumentException("三元組的行或列序號越界");    Triple elem = new Triple(row, column, value);    int i = 0;    // 在排序的三元組順序表中查找elem對象,或更改或插入    while (i < this.list.length()) {      Triple item = this.list.get(i);      // 若elem存在,則更改改位置矩陣元素      if (elem.compareTo(item) == 0) {        // 設置順序表第i個元素為elem        this.list.set(i, elem);        return;      }      // elem 較大時向后走      if (elem.compareTo(item) >= 0)        i++;      else        break;    }    this.list.insert(i, elem);  }  @Override  public String toString() {    String str = "三元組順序表:" + this.list.toString() + "/n";    str += "稀疏矩陣" + this.getClass().getSimpleName() + "(" + rows + " * "        + columns + "): /n";    int k = 0;    // 返回第k個元素,若k指定序號無效則返回null    Triple elem = this.list.get(k++);    for (int i = 0; i < this.rows; i++) {      for (int j = 0; j < this.columns; j++)        if (elem != null && i == elem.row && j == elem.colum) {          str += String.format("%4d", elem.value);          elem = this.list.get(k++);        } else {          str += String.format("%4d", 0);        }      str += "/n";    }    return str;  }  /**   * 返回當前矩陣與smat相加的矩陣, smatc=this+smat,不改變當前矩陣,算法同兩個多項式相加   *   * @param smat   * @return   */  public SeqSparseMatrix plus(SeqSparseMatrix smat) {    if (this.rows != smat.rows || this.columns != smat.columns)      throw new IllegalArgumentException("兩個矩陣階數不同,不能相加");    // 構造rows*columns零矩陣    SeqSparseMatrix smatc = new SeqSparseMatrix(this.rows, this.columns);    int i = 0, j = 0;    // 分別遍歷兩個矩陣的順序表    while (i < this.list.length() && j < smat.list.length()) {      Triple elema = this.list.get(i);      Triple elemb = smat.list.get(j);      // 若兩個三元組表示相同位置的矩陣元素,則對應元素值相加      if (elema.compareTo(elemb) == 0) {        // 相加結果不為零,則新建元素        if (elema.value + elemb.value != 0)          smatc.list.append(new Triple(elema.row, elema.colum,              elema.value + elemb.value));        i++;        j++;      } else if (elema.compareTo(elemb) < 0) { // 將較小三元組復制添加到smatc順序表最后        // 復制elema元素執行Triple拷貝構造方法        smatc.list.append(new Triple(elema));        i++;      } else {        smatc.list.append(new Triple(elemb));        j++;      }    }    // 將當前矩陣順序表的剩余三元組復制添加到smatc順序表最后    while (i < this.list.length())      smatc.list.append(new Triple(this.list.get(i++)));    // 將smat中剩余三元組復制添加到smatc順序表最后    while (j < smatc.list.length()) {      Triple elem = smat.list.get(j++);      if (elem != null) {        smatc.list.append(new Triple(elem));      }    }    return smatc;  }  /**   * 當前矩陣與smat矩陣相加,this+=smat, 改變當前矩陣,算法同兩個多項式相加   *   * @param smat   */  public void add(SeqSparseMatrix smat) {    if (this.rows != smat.rows || this.columns != smat.columns)      throw new IllegalArgumentException("兩個矩陣階數不同,不能相加");    int i = 0, j = 0;    // 將mat的各三元組依次插入(或相加)到當前矩陣三元組順序表中    while (i < this.list.length() && j < smat.list.length()) {      Triple elema = this.list.get(i);      Triple elemb = smat.list.get(j);      // 若兩個三元組表示相同位置的矩陣元素,則對應元素值相加      if (elema.compareTo(elemb) == 0) {        // 相加結果不為0,則新建元素        if (elema.value + elemb.value != 0)          this.list.set(i++, new Triple(elema.row, elema.colum,              elema.value + elemb.value));        else          this.list.remove(i);        j++;      } else if (elema.compareTo(elemb) < 0) { // 繼續向后尋找elemb元素的插入元素        i++;      } else {        // 復制elemb元素插入作為this.list的第i個元素        this.list.insert(i++, new Triple(elemb));        j++;      }    }    // 將mat中剩余三元組依次復制插入當前矩陣三元組順序表中    while (j < smat.list.length()) {      this.list.append(new Triple(smat.list.get(j++)));    }  }  // 深拷貝  public SeqSparseMatrix(SeqSparseMatrix smat) {    this(smat.rows, smat.columns);    // 創建空順序表,默認容量    this.list = new SeqList<Triple>();    // 復制smat中所有三元組對象    for (int i = 0; i < smat.list.length(); i++)      this.list.append(new Triple(smat.list.get(i)));  }  /**   * 比較兩個矩陣是否相等   */  public boolean equals(Object obj) {    if (this == obj)      return true;    if (!(obj instanceof SeqSparseMatrix))      return false;    SeqSparseMatrix smat = (SeqSparseMatrix) obj;    return this.rows == smat.rows && this.columns == smat.columns        && this.list.equals(smat.list);  }  /**   * 返回轉置矩陣   * @return   */  public SeqSparseMatrix transpose() {    //構造零矩陣,指定行數和列數    SeqSparseMatrix trans = new SeqSparseMatrix(columns, rows);    for (int i = 0; i < this.list.length(); i++) {      //插入矩陣對稱位置元素的三元組      trans.set(this.list.get(i).toSymmetry());    }    return trans;  }}

測試類:

package com.clarck.datastructure.matrix;/** * 稀疏矩陣的壓縮存儲 * * 稀疏矩陣三元組順序表 * * 三元組順序表表示的稀疏矩陣及其加法運算 * * @author clarck * */public class SeqSparseMatrix_test {  public static void main(String args[]) {    Triple[] elemsa = { new Triple(0, 2, 11), new Triple(0, 4, 17),        new Triple(1, 1, 20), new Triple(3, 0, 19),        new Triple(3, 5, 28), new Triple(4, 4, 50) };    SeqSparseMatrix smata = new SeqSparseMatrix(5, 6, elemsa);    System.out.print("A " + smata.toString());    Triple[] elemsb = { new Triple(0, 2, -11), new Triple(0, 4, -17),        new Triple(2, 3, 51), new Triple(3, 0, 10),        new Triple(4, 5, 99), new Triple(1, 1, 0) };    SeqSparseMatrix smatb = new SeqSparseMatrix(5,6,elemsb);    System.out.print("B " + smatb.toString());    SeqSparseMatrix smatc = smata.plus(smatb);    System.out.print("C=A+B"+smatc.toString());    System.out.println();    smata.add(smatb);    System.out.print("A+=B" + smata.toString());    System.out.println("C.equals(A)?" + smatc.equals(smata));    SeqSparseMatrix smatd = new SeqSparseMatrix(smatb);    smatb.set(0,2,1);    System.out.print("B " + smatb.toString());    System.out.print("D " + smatd.toString());    System.out.println("A轉置" + smata.transpose().toString());  }}

運行結果:

A 三元組順序表:((0, 2, 11), (0, 4, 17), (1, 1, 20), (3, 0, 19), (3, 5, 28), (4, 4, 50))稀疏矩陣SeqSparseMatrix(5 * 6):  0  0 11  0 17  0  0 20  0  0  0  0  0  0  0  0  0  0 19  0  0  0  0 28  0  0  0  0 50  0B 三元組順序表:((0, 2, -11), (0, 4, -17), (2, 3, 51), (3, 0, 10), (4, 5, 99))稀疏矩陣SeqSparseMatrix(5 * 6):  0  0 -11  0 -17  0  0  0  0  0  0  0  0  0  0 51  0  0 10  0  0  0  0  0  0  0  0  0  0 99C=A+B三元組順序表:((1, 1, 20), (2, 3, 51), (3, 0, 29), (3, 5, 28), (4, 4, 50), (4, 5, 99))稀疏矩陣SeqSparseMatrix(5 * 6):  0  0  0  0  0  0  0 20  0  0  0  0  0  0  0 51  0  0 29  0  0  0  0 28  0  0  0  0 50 99A+=B三元組順序表:((1, 1, 20), (2, 3, 51), (3, 0, 29), (3, 5, 28), (4, 4, 50), (4, 5, 99))稀疏矩陣SeqSparseMatrix(5 * 6):  0  0  0  0  0  0  0 20  0  0  0  0  0  0  0 51  0  0 29  0  0  0  0 28  0  0  0  0 50 99C.equals(A)?trueB 三元組順序表:((0, 2, 1), (0, 4, -17), (2, 3, 51), (3, 0, 10), (4, 5, 99))稀疏矩陣SeqSparseMatrix(5 * 6):  0  0  1  0 -17  0  0  0  0  0  0  0  0  0  0 51  0  0 10  0  0  0  0  0  0  0  0  0  0 99D 三元組順序表:((0, 2, -11), (0, 4, -17), (2, 3, 51), (3, 0, 10), (4, 5, 99))稀疏矩陣SeqSparseMatrix(5 * 6):  0  0 -11  0 -17  0  0  0  0  0  0  0  0  0  0 51  0  0 10  0  0  0  0  0  0  0  0  0  0 99A轉置三元組順序表:((0, 3, 29), (1, 1, 20), (3, 2, 51), (4, 4, 50), (5, 3, 28), (5, 4, 99))稀疏矩陣SeqSparseMatrix(6 * 5):  0  0  0 29  0  0 20  0  0  0  0  0  0  0  0  0  0 51  0  0  0  0  0  0 50  0  0  0 28 99

希望本文所述對大家java程序設計有所幫助。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
91亚洲国产成人精品性色| 欧美成在线视频| 九九精品视频在线观看| 成人免费xxxxx在线观看| 欧美激情喷水视频| 欧美高清videos高潮hd| 91精品国产高清自在线| 亚洲国产精品视频在线观看| 欧美国产高跟鞋裸体秀xxxhd| 精品成人国产在线观看男人呻吟| 国产精品偷伦视频免费观看国产| 色偷偷av一区二区三区乱| 国产99久久久欧美黑人| 伊人伊成久久人综合网小说| 欧美精品电影免费在线观看| 成人乱色短篇合集| 久久久久久久激情视频| 欧美性猛交xxxx免费看漫画| 一区二区欧美日韩视频| 欧美刺激性大交免费视频| 欧美一区二区三区免费观看| 视频直播国产精品| 久久久久久久国产| 国产成人亚洲精品| 国产精品高潮在线| 国产玖玖精品视频| 国产剧情日韩欧美| 欧美日韩福利在线观看| 日韩激情在线视频| 国产成人精品视| 欧美精品18videos性欧| 国产亚洲欧美一区| 在线电影欧美日韩一区二区私密| 日韩av影院在线观看| 亚洲一区二区三区视频播放| 欧美一区二区大胆人体摄影专业网站| 久久久精品2019中文字幕神马| 亚洲高清一二三区| 亚洲影影院av| 欧美激情精品久久久久久大尺度| 国产欧美精品一区二区| 美女福利精品视频| 国产美女精彩久久| 97在线视频观看| 亚洲第一中文字幕| 精品五月天久久| 欧美二区在线播放| 亚洲欧美在线磁力| 国产精品久久久久久搜索| 亚洲国产精品99| 日韩亚洲一区二区| 国产精品网站入口| 日韩精品视频在线| 亚洲欧美一区二区三区四区| 亚洲精品美女网站| 国产午夜精品理论片a级探花| 久久中文字幕在线视频| 北条麻妃在线一区二区| 91av在线播放| 国产成人精品免费久久久久| 欧美性生交大片免网| 992tv成人免费视频| 亚洲图片欧美日产| 亚洲性生活视频| 午夜精品久久久99热福利| 欧美性在线观看| 狠狠躁夜夜躁久久躁别揉| 欧美在线亚洲一区| 在线观看欧美www| 日本不卡高字幕在线2019| 伊人激情综合网| 中文字幕久久久| 91精品国产91久久久久久不卡| 91在线观看免费网站| 亚洲精品一区中文字幕乱码| 日韩成人小视频| 午夜美女久久久久爽久久| 日韩在线视频观看正片免费网站| 中文字幕无线精品亚洲乱码一区| 在线观看欧美成人| 亚洲一区二区国产| 亚洲精品国产精品久久清纯直播| 欧美大片第1页| 欧美日韩在线视频首页| 亚洲香蕉在线观看| 国产精品丝袜一区二区三区| 国产婷婷97碰碰久久人人蜜臀| 555www成人网| 亚洲第一综合天堂另类专| 不卡av电影院| 国产综合色香蕉精品| 久久中国妇女中文字幕| 国产美女久久精品香蕉69| 日本精品久久中文字幕佐佐木| 91高清视频在线免费观看| 日韩精品在线免费观看| 久久久久国产精品一区| 国产精品视频一区国模私拍| 欧美激情久久久久| 欧美激情视频在线观看| 国内精品在线一区| 国产精品日韩电影| 精品亚洲一区二区三区在线播放| 国产精品极品在线| 国产深夜精品福利| 国产不卡一区二区在线播放| 国产偷亚洲偷欧美偷精品| 国产欧美日韩中文字幕| 日韩中文在线中文网三级| 色综合久久中文字幕综合网小说| 亚洲另类xxxx| 国产日韩精品一区二区| 久久精品中文字幕电影| 97福利一区二区| 亚洲一区中文字幕| 欧美日韩成人网| 中文字幕欧美日韩在线| 68精品国产免费久久久久久婷婷| 亚洲精品成人久久电影| 日本免费一区二区三区视频观看| 美女国内精品自产拍在线播放| 国产亚洲精品久久久久久777| 国产成人一区二区三区| 国产成人在线视频| 国产精品99免视看9| 91成人免费观看网站| 97视频在线观看免费| 青青草原成人在线视频| 理论片在线不卡免费观看| 国产中文字幕日韩| 日韩精品中文字幕视频在线| 亚洲国产精品热久久| 欧美夫妻性生活xx| 欧美日韩国产精品一区二区不卡中文| 久久视频免费在线播放| 日韩av观看网址| 日韩av电影手机在线观看| 美女av一区二区三区| 川上优av一区二区线观看| 91久久久久久久久久久| 欧美大片网站在线观看| 亚洲国产欧美精品| 91超碰caoporn97人人| 91精品国产成人www| 亚洲激情视频在线| 久久久久久国产精品久久| 91精品国产自产在线| 成人免费网站在线看| 日韩日本欧美亚洲| 国产精品免费福利| 久久精品国产精品| 色樱桃影院亚洲精品影院| 中日韩午夜理伦电影免费| 亚洲电影天堂av| 97国产一区二区精品久久呦| 91免费国产网站| 色婷婷亚洲mv天堂mv在影片| 亚洲开心激情网| 国产九九精品视频| 亚洲影院在线看| 青青草99啪国产免费| 欧美性xxxxx| 中文字幕综合一区| 欧美高清一级大片|