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

首頁 > 編程 > C > 正文

基于C中一個行壓縮圖的簡單實現(xiàn)代碼

2020-01-26 16:17:56
字體:
供稿:網(wǎng)友

首先簡單說一下什么是行壓縮圖,其實嚴格意義上應(yīng)該是行壓縮矩陣。正常情況下,矩陣是用二維數(shù)組簡單存儲的,但是如果是稀疏矩陣,也就是零很多的時候,這樣比較浪費空間。所以就有各種節(jié)省空間的存儲方式,三元組存儲就是其中一種。

什么是三元組呢?一個三元組就是(row,col,value),這樣把所有不為零的值組成一個向量。這種存儲方式比二維數(shù)組節(jié)省了不少空間,當(dāng)然還可以進一步節(jié)省,因為三元組里面row或者col重復(fù)存儲了,一行或者一列存一次就行了,按這種思路走下去就是行壓縮存儲了。

那具體什么是行壓縮存儲呢?行壓縮存儲的思想就是,把所有不為零的值按行訪問的順序組成一個向量,然后再把每一行值不為0的列的下標存下來,這個兩個向量的大小和稀疏矩陣中不為0的值得個數(shù)相同,當(dāng)然要實現(xiàn)對行壓縮矩陣的訪問,還要把每一行的不為0的列的下標在第二個向量中開始的位置存下來,有人把這個叫做指針。有了這三個向量就可以實現(xiàn)對矩陣實現(xiàn)高效的按行訪問了。行壓縮存儲比三元組優(yōu)秀的不僅是空間的壓縮,還有就是行訪問時的高效。三元組如果是有序的,可以二分查找來訪問一行,但是行壓縮存儲按行訪問時的時間復(fù)雜度是常數(shù)級的。 大家可以參考下面這個行壓縮矩陣示意圖:

可能你會有疑問,你明明實現(xiàn)的行壓縮圖,怎么扯了這么多行壓縮矩陣呢?其實圖和矩陣是等價的,矩陣的一行可以看做是圖一個節(jié)點的出邊,矩陣的一列可以看做圖一個節(jié)點的入邊。當(dāng)然這里需要滿足兩個條件:第一個就是圖節(jié)點編號必須是從0或者1開始的連續(xù)數(shù)值(這個可以通過對圖的節(jié)點做一次映射解決),第二個就是圖必須至少是弱連通的(非連通圖可以拆成連圖片)。實現(xiàn)了稀疏矩陣的高效存儲訪問,也就實現(xiàn)了圖的高效存儲訪問。

下面來說一下,我的實現(xiàn)。我的實現(xiàn)跟經(jīng)典的行壓縮矩陣有兩個不同:第一個就是經(jīng)典的行壓縮矩陣沒有考慮一行全為0的情況,我對這種情況做了處理(之所以處理當(dāng)然不是因為我無聊,而是因為有這個需求)。第二個就是經(jīng)典的行壓縮圖對按列訪問比較慢(當(dāng)然是相對于按行訪問的速度而言),對行壓縮圖按列訪問時,時間復(fù)雜度是線性的。我也對這種情況做了處理。

這里簡單說一下我的思路:

第一個問題,我是通過將所有指針默認設(shè)為-1,即表示該行可能全為0,只有當(dāng)有非零值時才設(shè)置為其正確的指針。當(dāng)然訪問時也要做相應(yīng)的處理。

第二個問題,我是這樣解決的。我按列壓縮存儲的方式,存了一份每一列不為0的行下標,以及每一列不為0的行下標開始的位置。這樣我的實現(xiàn)中就多了兩個向量,浪費了存儲空間,但是提高了按列訪問時的效率。

好了,talk is cheap,show me the code。下面是我的代碼(可能有錯,我只做了簡單的測試)

利用邊向量構(gòu)造壓縮圖

復(fù)制代碼 代碼如下:

/*
 * buildGraph 利用邊向量 構(gòu)造壓縮圖
 * 對邊分別按第一個頂點、第二個頂點排序
 * 然后分別按行壓縮圖和列壓縮圖構(gòu)造行、列索引和指針
 * 全零行和全零列,指針置為-1
 */
    private void buildGraph(Vector<Edge> edges) {
        int edgeSize = edges.size();
        weight = new Vector<Float>(edgeSize);
        rowIndex = new Vector<Integer>(edgeSize);
        rowPtr = new Vector<Integer>(nodeCount + 1);
        colIndex = new Vector<Integer>(edgeSize);
        colPtr = new Vector<Integer>(nodeCount + 1);
        // set default value as -1
        for (int i = 0; i < nodeCount; ++i) {
            rowPtr.add(-1);
            colPtr.add(-1);
        }
        rowPtr.add(edges.size());
        colPtr.add(edges.size());

        // sort the edge based on first node
        EdgeBasedOnFirstNodeComparator cmp = new EdgeBasedOnFirstNodeComparator();
        Collections.sort(edges, cmp);
        // build row index and pointer
        int curNode = edges.elementAt(0).getFirstNode();
        int curPtr = 0;
        for (int i = 0; i < edgeSize; ++i) {
            Edge e = edges.elementAt(i);
            // System.out.println("curNode" + curNode + "firstNode: "
            // + e.getFirstNode());
            weight.add(e.getWeight());
            rowIndex.add(e.getSecondNode());
            if (curNode != e.getFirstNode()) {
                rowPtr.set(curNode, curPtr);
                curNode = e.getFirstNode();
                curPtr = i;
            }

        }
        rowPtr.set(curNode, curPtr);
        // sort the edge based on second node
        EdgeBasedOnSecondNodeComparator cmp2 = new EdgeBasedOnSecondNodeComparator();
        Collections.sort(edges, cmp2);
        // build column index and pointer
        curNode = edges.elementAt(0).getSecondNode();
        curPtr = 0;
        for (int i = 0; i < edgeSize; ++i) {
            Edge e = edges.elementAt(i);
            colIndex.add(e.getFirstNode());
            if (curNode != e.getSecondNode()) {
                colPtr.set(curNode, curPtr);
                curNode = e.getSecondNode();
                curPtr = i;
            }

        }
        colPtr.set(curNode, curPtr);
    }

復(fù)制代碼 代碼如下:

獲得一個節(jié)點的出邊
/*
 * getOutEdges 返回結(jié)點所有的出邊(即所有由結(jié)點指出的邊)
 *
 * @param node 要查找的結(jié)點
 *
 * @return 返回結(jié)點所有的出邊組成的向量
 */
@Override
public Vector<Edge> getOutEdges(int node) {
    Vector<Edge> res = new Vector<Edge>();
    int startIndex = getStartIndex(node, true);
    if (startIndex == -1) {
        // 沒有出邊的點
        return null;
    }
    int endIndex = getEndIndex(node, true);
    float value;
    Edge e;
    int outNode;
    for (int index = startIndex; index < endIndex; ++index) {
        value = weight.elementAt(index);
        outNode = rowIndex.elementAt(index);
        e = new Edge(node, outNode, value);
        res.add(e);
    }
    return res;
}

獲得一個節(jié)點的入邊
?
/*
 * getInEdges 獲取結(jié)點所有的入邊(即所有指向結(jié)點的邊)
 *
 * @param node 要查找的結(jié)點
 *
 * @return 返回所有由結(jié)點入邊組成的向量
 */
@Override
public Vector<Edge> getInEdges(int node) {
    Vector<Edge> res = new Vector<Edge>();
    int startIndex = getStartIndex(node, false);
    // 沒有入邊的點
    if (startIndex == -1) {
        return null;
    }
    int endIndex = getEndIndex(node, false);
    float value;
    Edge e;
    int inNode;
    for (int index = startIndex; index < endIndex; ++index) {
        inNode = colIndex.elementAt(index);
        value = getWeight(inNode, node);
        e = new Edge(inNode, node, value);
        res.add(e);
    }
    return res;
}


這里訪問方式就跟按行訪問不一樣了,行訪問時,直接讀weight向量里面對應(yīng)的值就行了,這里不行,應(yīng)該weight向量是按行訪問順序存的。我的解決方法,獲取入節(jié)點,然后對整個節(jié)點對按行訪問獲得對應(yīng)值。這樣雖然繞了一下,但是對于稀疏圖來說,基本上也是常數(shù)級的。下面是getWeight的代碼
復(fù)制代碼 代碼如下:

/*
     * getWeight 獲得特定邊的weight
     */
    private float getWeight(int row, int col) {
        int startIndex = getStartIndex(row, true);
        if(startIndex==-1)
            return 0;
        int endIndex = getEndIndex(row, true);
        for (int i = startIndex; i < endIndex; ++i) {
            if (rowIndex.elementAt(i) == col)
                return weight.elementAt(i);
        }
        return 0;
    }

最后是對行或者列全0時的特殊處理,這里處理,體現(xiàn)在從指針向量獲取開始和結(jié)束位置的函數(shù)上
復(fù)制代碼 代碼如下:

/*
 * getStartIndex 獲取特定頂點的開始索引
 */
    private int getStartIndex(int node, boolean direction) {
        // true : out edge
        if (direction)
            return rowPtr.elementAt(node);
        else
            return colPtr.elementAt(node);
    }

 
?
/*
 * getEndIndex 獲取特定頂點的結(jié)束索引
 */
    private int getEndIndex(int node, boolean direction) {
        // true:out edge
        if (direction) {
            int i = 1;
            while ((node + i) < nodeCount) {
                if (rowPtr.elementAt(node + i) != -1)
                    return rowPtr.elementAt(node + i);
                else
                    ++i;
            }
            return rowPtr.elementAt(nodeCount);
        } else {
            int i = 1;
            while ((node + i) < nodeCount) {
                if (colPtr.elementAt(node + i) != -1)
                    return colPtr.elementAt(node + i);
                else
                    ++i;
            }
            return colPtr.elementAt(nodeCount);
        }
    }


這里我只實現(xiàn)了兩個最簡單的功能,獲取入邊和出邊。一方面是因為,對于我做的東西,這兩個函數(shù)就夠了,另一方面,對于一個圖來說,有這兩個函數(shù),其他函數(shù)都可以相應(yīng)實現(xiàn)。

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表

圖片精選

国产制服丝袜在线| 欧美一区二区性放荡片| 女主播福利一区| 国产精品亚洲一区二区三区在线观看| 69精品人人人人| 欧美日韩亚洲综合一区| 青青青国产在线观看| 日韩av黄色片| 黑人巨大精品一区二区在线| 色播五月综合网| 你懂得视频在线观看| 亚洲尤物影院| 国产精品久久久免费| 在线免费观看日韩欧美| 人妻少妇精品无码专区久久| 国产精品九九九九九| yjizz国产| 国产一区二区三区探花| 都市激情亚洲综合| 伊人五月天婷婷| 精品久久久久久国产91| 精品国产日本| 欧洲精品一区二区三区久久| 九九精品在线播放| 天天做日日爱夜夜爽| 久久99精品久久久久久噜噜| 欧美偷拍第一页| 国产资源中文字幕| 99这里有精品视频| 国产视频一二区| 91精品国产色综合久久久蜜香臀| 91免费看蜜桃| 另类国产ts人妖高潮视频| 妺妺窝人体色www在线下载| 欧美日韩亚洲另类| 91在线视频| 欧美 国产 日本| 国产精品久久久久一区二区三区| 国产男人搡女人免费视频| 欧美激情免费看| aiai在线| 日日天天久久| 五月天色婷婷丁香| 国产免费黄色大片| 亚洲性感美女99在线| 国产日韩欧美自拍| 羞羞在线观看网站| 缅甸午夜性猛交xxxx| 男女下面一进一出无遮挡| 九色成人国产蝌蚪91| 7777免费精品视频| 97香蕉超级碰碰久久免费的优势| 正在播放亚洲一区| 7777精品久久久大香线蕉| 精品在线小视频| 深夜福利网站在线观看| 国产在视频线精品视频www666| 91最新在线观看| 国产成人97精品免费看片| 欧美日韩国产综合视频在线观看中文| 国产欧美精品日韩| 狠狠狠狠狠狠狠| 国产精品亚洲一区二区无码| 免费播放片a高清在线观看| 中文字幕巨乱亚洲| 传媒在线观看| 欧美精品aaa| 乱亲女h秽乱长久久久| 国产精品免费视频久久久| 性猛交xxxx| 人妻大战黑人白浆狂泄| 一区二区视频免费在线观看| 久久夜色精品国产欧美乱极品| 一级日本黄色片| 中文字幕亚洲色图| 最近中文字幕在线观看视频| 欧美xxxx性xxxxx高清视频| 在线视频欧美日韩精品| 精品三级av在线导航| 中文字幕一区二区久久人妻网站| 秋霞成人午夜伦在线观看| 久久亚裔精品欧美| 懂色av色香蕉一区二区蜜桃| 97精品久久| 中文字幕在线综合| av激情在线观看| 国产精品美女久久久久久不卡| 日韩欧美一区电影| 成人动漫在线免费观看| 欧美娇小极度另类| 亚洲成在人线在线播放| 精品人体无码一区二区三区| 美日韩精品免费视频| 亚洲一区国产精品| 26uuu欧美| 啪啪免费视频一区| 国产精品一区二区免费视频| 欧美日韩一级片网站| www.天天操.com| 精品国产乱码久久久久久樱花| 人妻精品久久久久中文| 欧美日韩一区二区三区四区五区| 日本在线一区二区| 日韩在线精品强乱中文字幕| 77777少妇光屁股久久一区| 青草青草久热精品视频在线观看| 麻豆网址在线观看| 激情亚洲另类图片区小说区| 国产精品视频免费一区二区三区| 亚洲精品久久久久久久久久久久久| 国产成人在线小视频| 亚洲国产日韩精品在线| 国产欧美日韩另类视频免费观看| 国内精品区一区二区三| 成人欧美精品一区二区| 在线免费91| jazzjazz国产精品麻豆| 久久精品国产99国产| 男人用嘴添女人下身免费视频| 久久久久久69| 国产米奇在线777精品观看| 亚洲美女爱爱视频| 国产精品a级| 久久久精品美女| 国产精品伦一区| 亚洲精品自产拍在线观看app| 国产三级生活片| 国产在线一区二区三区| 偷拍精品福利视频导航| 亚洲免费视频中文字幕| 91精品国产美女浴室洗澡无遮挡| 中文字幕精品视频在线| 中文字幕一二区| 亚洲日本国产精品| 国产精品高清无码在线观看| 成人午夜精品一区二区三区| 欧美日韩一区二区三区不卡视频| 一级日韩一区在线观看| 精品三级在线观看| 国产二级c片l毛片| 欧美三级第一页| 一区二区三区日| 宅男午夜在线| 98色花堂精品视频在线观看| 麻豆国产原创| 国产免费人人看| 国产精品免费福利| 松下纱荣子在线观看| 99国产精品欲| 亚洲女人被黑人巨大进入| 国产精品理人伦一区二区三区| 欧美另类极品videosbest最新版本| 欧美不卡在线观看| 天天噜噜噜噜噜噜| 爱福利视频一区| 成人欧美一区二区三区黑人免费| 久久波多野结衣| 香港一级纯黄大片| 国产口爆吞精一区二区| 麻豆精品一区二区av白丝在线| 免费在线一区观看| 国产精品理论在线观看| 日本黄区免费视频观看| 色婷婷av一区二区三区在线观看| 99se视频在线观看| 亚洲国模精品私拍| 久久av一区二区三区| 欧美电影在线观看免费| 草草影院在线| 亚洲色图丝袜| 午夜欧美一区二区三区免费观看| 免费一区二区三区视频导航| 午夜黄色在线观看| 日本黄色电影网站| 美腿丝袜亚洲色图| 中文字幕一区二区在线播放| 人人狠狠综合久久亚洲| 久久7799| 美女免费免费看网站| 久草免费资源站| 欧美成人a∨高清免费观看| 久久久久久久综合狠狠综合| 在线观看免费视频你懂的| 中文字幕av中文字幕| 日韩精品第1页| 日本精品久久电影| 国产激情视频一区二区三区| 亚洲不卡av一区二区三区| 欧美成人乱码一区二区三区| 国产又粗又猛又爽又| 国产小视频在线播放| 久久亚洲精品欧美| 国产精品传媒麻豆hd| 免费观看91视频大全| 日批视频网站| 91免费小视频| 精品视频免费| 极品人妻videosss人妻| 中文在线综合| 少妇高潮久久久| 午夜精品福利视频| 国产原厂视频在线观看| **孕交吃奶水一级毛片| 男人本色网站| 久久不卡免费视频| 五月天丁香社区| 日韩黄色免费电影| 丰满少妇一区二区三区专区| 欧洲金发美女大战黑人| 一区二区三区四区五区| 日韩精品第一| 国产女人18水真多18精品一级做| 久久亚洲精品国产精品紫薇| 2018中文字幕一区二区三区| 日本黄色一区| 91免费看片在线| 一区二区三区视频在线| 男人天堂网在线视频| 国产精品尤物视频| 亚洲人成在线观看一区二区| 一级做a爱片久久毛片| 精品一区二区三区中文字幕老牛| 久久精品水蜜桃av综合天堂| a级片在线观看免费| 亚洲精品一区二区三区av| 国产视频第一页| 国产成在线观看免费视频| 偷拍精品精品一区二区三区| 校园春色 亚洲色图| 含羞草www国产在线视频| 在线观看av中文字幕| 久久精品夜色噜噜亚洲a∨| 亚洲国产一二三| 亚洲在线一区| 成人免费网站观看| 亚洲性69xxxbbb| 久久精品国产秦先生| 成人性生交大片免费看视频在线| 神马国产精品影院av| 亚洲伦片免费看| 国产二级片在线| 天涯成人国产亚洲精品一区av| 一道本成人在线| 久久视频精品在线| 精品久久久久久久人人人人传媒| 91国产精品成人| 中文字幕在线观看视频网站| 99热国产在线| 国产无遮挡裸体免费视频| 狠狠操狠狠色| 亚洲高清一区二| 成年人精品视频| 精品一区二区在线欧美日韩| 国产成人自拍偷拍| 91精品国产综合久久久久久豆腐| 好男人www社区在线视频夜恋| 最近2019年日本中文免费字幕| 成人在线观看免费| 一区二区三区影视| 欧美视频中文字幕在线| 手机在线精品视频| 国产真实乱人偷精品| 欧美日韩中字| 欧美日韩一级片在线观看| 手机在线理论电影| 欧美成人禁片在线www| 久久这里只精品最新地址| 欧美激情综合色综合啪啪五月| 都市激情亚洲色图| 人妻无码视频一区二区三区| 狠狠色综合色综合网络| 亚洲成人三级| 美国黄色一级视频| 亚洲成色在线综合网站2018站| 久久久精品91| 国产精品久久久久久久岛一牛影视| 国产精品宾馆在线精品酒店| japonensisjava老师可播放| 日日摸日日碰夜夜爽av| 久久影院理伦片| 四虎网站在线观看| 免费看美女隐私的视频| av片哪里在线观看| 欧美一区二区三区系列电影| 老牛国产精品一区的观看方式| 国产第一页在线播放| 成人av在线播放观看| 午夜精品一区二区三区在线观看| 中文字幕免费高清电视剧网站在线观看| 黑人一区二区三区| 亚洲天堂视频在线播放| 久久综合狠狠综合| 日韩毛片免费观看| 久久精品2019中文字幕| 欧美一区深夜视频| 免费看黄色a级片| 一区二区高清免费观看影视大全| 日本免费福利视频| 中文字幕第一区综合| 国产一区二区三区在线看麻豆| 一区二区三区日韩视频| 日日摸夜夜添夜夜添国产精品| 国产精品偷伦视频免费观看国产| 久热久热免费视频中文字幕777| 欧美成人三级在线视频| 欧亚精品在线观看| 性生活一级大片| 天天射综合网视频| 亚洲一区二区三区四区五区六区| 久久精品亚洲成在人线av网址| av不卡在线| 91国内揄拍国内精品对白| 免费观看成人高| 一区二区小说| 嫩草在线视频| 男女羞羞免费视频| 四虎在线免费观看| 视频区 图片区 小说区| 亚洲精品成人无码熟妇在线| 日韩欧美国产不卡| 国产一级片黄色| 特级特黄刘亦菲aaa级| 欧美肥胖老妇做爰| 国产一级一片免费播放| 狠狠v欧美v日韩v亚洲ⅴ| 91精品婷婷国产综合久久性色| 香蕉视频在线观看www| 日韩欧美一区二区三区久久婷婷|