20182301 2019-2020-1「オブジェクト指向プログラミングとデータ構造、」第十週ラーニングの概要
コンテンツ概要を学びます
コンフィギュレーションの構成図
- 頂点(頂点)のようなデータ要素を描画します
側面(エッジ):Aとして、これらの頂点を結ぶ線を描画します
- G =(V、E)或者G =(V(G)、E(G))
- V(G)は、すべての頂点の集合の構成を示し、ここで、頂点は異なる数字や文字で表すことができます。E(G)はグラフ構造内のすべてのエッジの集合であり、各側は、接続された2つの頂点によって表されます。
図構成頂点集合V(G)は、空でない頂点が含まれている必要があり、構成セットを示す側面図にはエッジを示さない、空であってもよいです。
基本的なコンセプトマップ
- 無向グラフ
構造の観点からは、エッジの全てが全く方向を持っていない場合、これは、それが無向グラフと呼ばれているマップ。図IIに示すような典型的な無向グラフ。必要でない場合、図中のない無指向エッジので、我々は、頂点の順序の両側を表します。例えば、頂点と頂点V5間VIエッジは、(V2、V6)のように表すことができ、それは(V6、V2)として表すことができます。
- 有向グラフ
構造の観点からは、エッジが、これは、図IIIに示す図で有向グラフ、呼ばれ、指向です。順序が2つの頂点を必要としたときにグラフ指向のエッジので、我々は、エッジを表します。我々は、アングルブラケットは、例えば有向エッジを表し使用<V2、V6>は、頂点V2に頂点からV6を表し、<V6、V2> V6は、頂点V2の頂点を表します。
- 学位の頂点
- 頂点の頂点を接続するエッジの数と呼びます。有向グラフとそこに無向グラフの異なる頂点を有します。無向グラフのために、Vの頂点は、頂点に接続されたエッジの数である、比較的単純であり、D(V)と呼びます。
- 有向グラフは、やや複雑であるためには、頂点Vを結ぶ辺の方向に応じて、頂点の程度及び浸透の程度があります。
- これは、ID(V)と呼ばれる、エンドポイントの数の辺の頂点です。
- 頂点の程度は、OD(V)と呼ばれる、エッジエンドポイントの数です。
- 隣接行列
- 隣接する二つの頂点を指すは、図のエッジ構造の頂点です。異なる隣接する頂点を有向グラフとそこに無向グラフを有します。無向グラフの場合、隣接する頂点は比較的簡単です。
- 有向グラフは、やや複雑であるためには、頂点Vを結ぶ辺の方向に応じて、2つの頂点を開始頂点(起点または出発点)および終了頂点(エンドポイント)と呼ばれます。グラフの隣接頂点に2つのカテゴリに分類があります。
- 頂点エッジに隣接:初期頂点の頂点を接続するエッジ。例えば、このエッジの組成<V2、V6> 2つの頂点のために、V2は、隣接するエッジの頂点V6です。
- 隣接する頂点エッジ:頂点の端縁に接続された頂点。例えば、組成物<V2、V6>このエッジの2つの頂点のために、V6は、エッジに隣接する頂点V2です。
- 無向完全グラフ
各2つの頂点間の数字は、自由縁の存在下にある場合、この構造は、完全グラフを無向図と呼ばれます。図4に示す典型的な無向完全グラフ。
- 無向完全グラフは、M、縁M(M-1)/ 2の合計数の頂点が含まれているため、理論的に、証明することができます。例えば、エッジの総数は、図4である。5(5-1)/ 2 = 10。
- 監督完全グラフ
有向グラフ二つの頂点間の各エッジに対向する2つの方向がある場合、この構造は、図と呼ばれる図完全に向かいます。図Vに示すように、典型的には、完全な有向グラフ
- 理論的には、N個の頂点が完全グラフである含むため、エッジの総数はN(N-1)であり、証明することができます。双方はそれぞれ2つの頂点の間に必要ので、これは、これはよく理解され、二回無向完全グラフです。
- 有向非巡回グラフ(DAG図)
- バックポイントへのいくつかの側面を通って有向グラフ頂点からの逸脱がない場合、このグラフは、有向非循環グラフです。
- 非循環有向グラフはブロック鎖、当技術分野で使用することができます。
- チャートやマップに右に資格がありません
右本明細書エッジノード間およびノードこの側面は、図には特定の値を題さないれていないため、対応する数値を有しているか否かである値と理解することができます。右ノードとノードとの間の関係図は、エッジ値が時間であるように、そのような時間への1つの頂点または他の頂点から2つの頂点間の距離の数値の代表として、値を表現するために必要とされ得ますなお、図中の右と呼ばれる2つのノード間の関係を表す図。
- 接続グラフ
下に示すように、グラフ内の各ノードは、必ずしも、この図の接続を含むように、各ノードを接続するエッジれません。
- 上記同図に見ることができる完全に接続されていません。
- 図の簡単な(簡易グラフ)
- ノード間の2つのノードおよびエッジ、特別の両側があるため
- リム(自己ループ)ため:エッジノード自体、それら自身を指します。
- 平行な側面(平行エッジ):2つのノード間の接続された複数のエッジが存在します。
双方は、あなたがこのような状況の平行な側面を使用することができますので、このような三の方法として、道路を持っていない可能性があり、このような都市Aから都市Bのように、意味があります。しかし、アルゴリズム設計上の2つの側面が達成することをより困難にします。図は、単に両面を考慮されていません。
一般的なグラフアルゴリズム
- 幅優先トラバーサル
- トラバーサル方法は:半径方向に広い領域の周りの開始頂点から、最初のトラバーサル
- 方法:隣接する頂点の頂点にアクセスするためのデキュー行くに横断指定された順序を保持するキューの必要性
- トップ擬似コード:
- 訪問したように、初期のアクセス・ノードは、ノードvとVをラベル。
- ノードのキューV
- キューが空でない場合は、そうでない場合は、アルゴリズムの終了を続けます。
- HOLを取得するキューは、uのノード。
- W最初の隣接ノードのノードUを見つけます。
- 隣接ノードwをノードuが存在しない場合、ステップ3に進み、そうでない場合、サイクルは3つのステップを以下
- まだワットノードがアクセスされた場合は訪問したとして、アクセスノードは、Wとマーク。
- ワット・ノードのキュー
- 隣接ノードを次ノードw Uのワット次の隣接ノードを検索し、ステップ6に進みます。
- 読影:1-> 2-> 3-> 4-> 5-> 6> 7> 8:あるアルゴリズムの幅優先横断順序
- 深さ優先探索
- トラバーサル方法:頂点から出発して、探索する各頂点エッジワイズ。(端的:使用片道!)
- 方法:店舗へのスタックの順序によって頂点に遭遇した横断固定、ちょうど(それの繰り返し使用による)スタック、それをない得るために、そのノードは、それがキューの最初の訪問ではありません。存在する場合は、隣接する頂点のみ、スタックの頂部にアクセスしていない、とされていません。
- トップ擬似コード:
- 初期アクセスノードv、および訪問したとしてマークされたノードV。
- ワット最初の隣接ノードにおけるノードvを探します。
- そうでない場合は、アルゴリズムの端は、4に進み、存在する場合、W。
- アクセスがない場合、wは再帰的深さ優先トラバーサルにW(即ち、W、Vなどの他は、次いで、123ステップ)。
- ノードの次の隣接ノードの隣接ノードV wを見つけ、ステップ3に進みます。
- 画像は、説明した:1-> 2-> 4-> 8> 5-> 3-> 6> 7の深さ優先トラバーサル順序を
最短経路問題
- シングルソースの最短パスは図に権利はありません。
まず、我々は0に設定されている経路長の点を開始するだろう、他の頂点の経路長は、V1に出発点として、(凡例?表現と、他の可能な値であってもよい)、負の数次の例を設定されています
我々は、長いを開始頂点経路は、確かになることを、本実施形態V3とV4でパス1、即ち、の長さの開始点0への経路の長さだけ頂点:
次に、我々は経路長頂点(V3及びV4)は経路長の頂点に1尖ったが2に設定され、同じことが頂点頂点1の唯一の経路長は長さ2のパスを指摘していることを確認することができます。しかし、この時間は、問題が発生します:V3 V4は尖った頂点であるが、経路長v3は、明らかに2に設定すべきではありません。私たちは「既知」の頂点の集合の既知の経路長を必要とするので、マークは、知られているパスの長さは、もはやアプローチが述べコードを与えられている場合は特に、彼らの頂点を変更しません。本実施形態では、頂点に設定する経路長が2 V2、V5、V6であります
- 規則は、頂点iは未知の経路長に向けられている頂点の経路の長さI + 1、I 0から、すなわち、終了条件:現在のパスの長さが他の頂点Iの頂点または頂点尖ったにポイントをしないでそれは知られています。
- 開始点として頂点を決定した後、開始点があるかもしれないし、その後、頂点から出発し、そのような私たちの例のように、到達できないので、終了条件が言うことことに注意してください、我々は、すべての頂点が知られるようになって聞いていませんでしたV0、パスからV0にv1が存在しません。
最短経路の計算結果は、以下のように構成されたリニアテーブルに格納されています。
既知の場合、頂点、および最短経路長の開始点、フロント頂点自体で最短パス:「ライン」は、テーブル内の線形要素であり、セルの各行は、4つの要素4つのドメインです。
- 最短パスは、この表で示される処理の前に計算され、これは以下のとおりであります:
- シンプルな擬似コード
//无权最短路径计算,图存于邻接表graph,结果存入pathTable,起点即start
void unweightedPath(Node* graph,struct pathNode* pathTable,size_t start)
{
pathTable[start].known=true;
pathTable[start].distance=0; //若pathTable[x].distance为0,则其preV是无用的,我们不予理睬
//初始化pathTable中的其他元素
//curDis即当前距离,我们要做的是令distance==curDis的顶点所指的未知顶点的distance=curDis+1
for(int curDis=0;curDis<numVertex;++curDis)
{
for(int i=0;i<numVertex;++i)
{
if(!pathTable[i].known&&pathTable[i].distance==curDis)
{
pathTable[i].known=true;
//遍历pathTable[i]所指向的顶点X
{
if(!pathTable[X].known)
{
pathTable[X].preV=i;
pathTable[X].distance=curDis+1;
}
}
}
}
}
}
- だから、未知のが知られていることをその頂点の頂点間距離= curDis +重量で
アイデアは解決することである。我々は、その距離変更された、私たちはその距離を変更することができることを最小限最小限にし、それが知られているだろうこれらの未知の頂点を見るためにすべての既知、未知の頂点ポイントのすべての頂点をリストアップ。
最初の出発点はV0であると仮定すると、通常の初期化(我々はまた、エッジの重みを特定する)です。
V1、V2、V3:その後、我々はすべてを、既知の頂点(V0のみ)は、すべての未知の頂点を指摘しました。場合は、次に、それらの距離を変更し、v1.distance = v0.distance + 1 = 1、v2.distance = v0.distance + 3 = 3、v3.distance = v0.distance + 5 = 5見出さ。我々は距離のみのV1、および既知のセットV1、V2を変更するように変更された後に明らかにv1の距離は、最小で未知の頂点である、v3は移動しません。
V2、V3、V4:その後、我々はすべての未知の頂点を指摘し、すべての既知の頂点(V0、V1)を一覧表示し続けます。見つかった場合、それらの距離を変更し、v2.distance = v0.distance + 3 = 3、v4.distance = v1.distance + 1 = 2、v3.distance = v1.distance + 1 = 2(ただしもV3 V0を指ししかしV3にV1からV3にV0よりも経路長が大きいほど、によってので、我々は一つのそのようなV4としてのみ距離V4を変更選択v3および新しい最小距離V4平行な小さい方距離V3)、そしてV4が、知られているに設定された他の固定されています。
我々はすべての既知の頂点(V0、V1、V4)は、すべての未知の頂点に指摘リスト、続行:V2、V3、V6は、その変更された場合、v2.distance = 3、v3.distance = 2、v6.distance =発見3、私たちは距離のみV3を修正、および既知のV3に設定されています:
その変更した場合、v2.distance = 3、v5.distance = 10、V6たV2、V5、V6、:我々はすべての知られているすべての未知の頂点に指摘頂点(V0、V1、V3、V4)を一覧表示し、続行。距離= 3、我々は、任意に、V2とV6でV2と、のみv2.distanceを変更し、V2に知られています。
V5、V6、v5.distance = 5、v6.distance = 3、変更した場合、我々は唯一のV6を変更するようことがわかった:我々はすべての未知の頂点のすべての既知の頂点ポイントの一覧を表示、続行します。
その距離= 5への変更は、私たちが知られているアルゴリズムの端にそれとセットを変更する場合は最後に、唯一の未知の頂点V5は、アウトセット:
図題する擬似コード:
//有权最短路径计算,图存于邻接表graph,结果存入pathTable,起点即start
void weightedPath(Node* graph,struct pathNode* pathTable,size_t start)
{
//初始化pathNode数组
size_t curV;
while(true)
{
//找到可确定distance的未知顶点中新distance最小的那个,存入curV,若没有则跳出循环
//令pathNode[curV].distance和pathNode[curV].prev修改为正确的值
pathNode[curV].known=true;
}
}
教科書の学習と問題解決プロセス
- 質問1:理解トポロジカル整列
問題1ソリューション:(リンク5を参照してください)
- 図トポロジカルソートが要求される頂点をソートするために実行される:VX VYからパスが存在する場合、その結果必要VX VYをソートする前に。
- マップのトポロジカルソートは非循環グラフを持つようにする必要があります。
- VYにトポロジカルソート、VXマスト前方側(VY、VX)によって要求されるよう無向グラフでは、あるエッジ(VX、VY)場合確かに、存在するが、それらは明らかであるフロントVY VX、でなければなりません矛盾するので、トポロジカルソートは、有向グラフのために使用することができます。
- このような環V0-V1-V4-V3-V0は、2つのサブパスを暗示する図として、有向グラフである:パスの点で前者によれば、V0-V1-V4及びV4-V3-V0、ソートV0がV4の前に、パスの条件に従って、V4とも明らかに矛盾であるので、トポロジカルソートのみ非環状グラフを使用することができるV0を、先行しなければならないしなければならない結果となります。
- 非環式有向グラフ2つの機能があります。
- 図は、非環式指向場合、0度の頂点が存在しなければなりません。
- 有向非巡回グラフは、それを除去し、(有向エッジにおける頂点に出発点として必要)頂点0の両側に接続されている場合は、図非循環グラフに依然としてあります。
擬似コード:
void topSort(graph* g,size_t numVertex,size_t topResult)
{
//两个表示顶点的变量,后面用
size_t tempV,adjV;
//存储各顶点入度的数组,顶点x的入度为indegree[x]
size_t indegree[numVertex];
伪:根据图g初始化indegree数组
for(int i=0;i<numVertex;++i)
{
伪:从indegree中找到一个入度为0的顶点,存入tempV
if(伪:没找到入度为0的顶点)
伪:报错、返回
topResult[i]=tempV;
伪:通过g[tempV]遍历tempV为起点的边的终点,存入adjV
indegree[adjV]--;
}
}
- 質問2:マップの幅優先トラバーサルとは何か深さ優先探索の間の最も基本的な違いは?
- 問題2ソリューション:
- アプローチが採用スタックの非再帰的深さ優先トラバーサル;非再帰的アプローチキュー幅優先トラバーサルを使用する場合
- 深さ優先探索は、これまでに取得していない深い各ブランチに行くことです。また、第一トラバーストラバース配列としても知られている、上から下にトラバース層によって層;プレオーダー特に、先行順、後順であります
- 質問3:Webクローラーの深さ優先探索について、詳しく見て
- 質問3ソリューション:
- Webクローラー(また、Webスパイダー、ウェブロボットとして知られ、FOAFコミュニティの途中で、より頻繁にウェブチェイサーと呼ばれる)、ワールド・ワイド・ウェブのプログラムやスクリプトで自動的にグラブ情報、フォロー一定のルールのようなものです。他のあまり頻繁に使用される名前はアリ、自動インデックス作成、シミュレーションプログラムやワームが含まれます。
- アクセス制限の頻度。
- ヘッダチェックサムヘッダ情報。
- 動的なページ生成。
- 動的なページ生成。
- ログイン制限;
- 検証コードの制限。
- 爬虫類の例
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.MalformedURLException;
import java.net.URL;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
public class Reptile {
public static void main(String[] args) {
// 传入你所要爬取的页面地址
String url1 = "http://www.xxxx.com.cn/";
// 创建输入流用于读取流
InputStream is = null;
// 包装流, 加快读取速度
BufferedReader br = null;
// 用来保存读取页面的数据.
StringBuffer html = new StringBuffer();
// 创建临时字符串用于保存每一次读的一行数据,然后 html 调用 append 方法写入 temp;
String temp = "";
try {
// 获取 URL;
URL url2 = new URL(url1);
// 打开流,准备开始读取数据;
is = url2.openStream();
// 将流包装成字符流,调用 br.readLine() 可以提高读取效率,每次读取一行;
br = new BufferedReader(new InputStreamReader(is));
// 读取数据, 调用 br.readLine() 方法每次读取一行数据, 并赋值给 temp, 如果没数据则值 ==null,
// 跳出循环;
while ((temp = br.readLine()) != null) {
// 将 temp 的值追加给 html, 这里注意的时 String 跟 StringBuffer
// 的区别前者不是可变的后者是可变的;
html.append(temp);
}
// 接下来是关闭流, 防止资源的浪费;
if (is != null) {
is.close();
is = null;
}
// 通过 Jsoup 解析页面, 生成一个 document 对象;
Document doc = Jsoup.parse(html.toString());
// 通过 class 的名字得到(即 XX), 一个数组对象 Elements 里面有我们想要的数据, 至于这个 div的值,打开浏览器按下 F12 就知道了;
Elements elements = doc.getElementsByClass("xx");
for (Element element : elements) {
// 打印出每一个节点的信息; 选择性的保留想要的数据, 一般都是获取个固定的索引;
System.out.println(element.text());
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
コード学習と問題解決プロセス
- 質問1:度と浸透を計算する場合、0がより多く常にある、となぜですか?
- 問題1ソリューション:
- これが初期化されていなかったので、これを0にデフォルトにはポイントはその後、ありません
for(i=0;i<5;i++){
for(j=0;j<5;j++){
a[i]=0;
b[i]=0;
dig[i][j]=-1;
}
}
質問2:入力ポイントがオーバーフローすることができず、次のように:
問題2ソリューション:
for(i=0;i<5;i++){
System.out.println("请输入第一个: ");
int input0 = scan.nextInt();
dig[i][j] = input0;
for(j=1;;j++){
System.out.println("请问是否有下一个接点 ");
String kong = scan.nextLine();
char yn = scan.next().charAt(0);
if(('Y' == yn)||(yn == 'y')){
String kong2 = scan.nextLine();
int input = scan.nextInt();
dig[i][j] = input;
a[i]++;
}
else{
j=0;
break;
}
}
}
for(int k=0;k<5;k++) {
for(j=0;j<5;j++){
for(i=0;dig[j][i]!=-1;i++){
if(dig[j][i]==k)
b[k]++;
}
}
}
合計コード
マネージコード章XIX
コードブック章XIX
(実行結果はstatistics.shスクリプトをスクリーンショット)
先週試験間違った質問の概要
いいえ、最近の検査ませんので、ノー間違った質問
コメントは、学生のブログやコードを持っていました
- 今週の学習をペア
- 20182326
- ペアの写真
- 结对学习内容
- 学习图的定义
- 学习图的遍历
- 先週のブログピアアセスメントケース
その他(知覚、思考、など、別売)
チームは重要であり、我々はすべての困難を克服するために協力することができます。
学習の進捗バー
コードの行の数(追加/累算) | ブログ量(追加/蓄積) | 学習時間(追加/蓄積) | 重要な成長 | |
---|---|---|---|---|
目標 | 10,000行 | 30 | 400時間 | |
最初の週 | 69分の69 | 2/2 | 30/30 | スキャナ |
二三週間 | 598分の529 | 3/5 | 55分の25 | いくつかの一般的なクラス |
4週 | 300/1300 | 2/7 | 80分の25 | JUnitのテストとライティングのクラス |
5週目 | 2665/3563 | 2/9 | 110分の30 | リモートとのインタフェース |
6週 | 1108/4671 | 1/10 | 135分の25 | 多型と異常 |
7週 | 1946/6617 | 3/13 | 160分の25 | スタック、キュー |
8週目 | 831/7448 | 1/14 | 185分の25 | ソート、検索 |
週ナイン | 13507分の6059 | 3/17 | 220分の35 | バイナリ検索ツリー |
10週目 | 13507分の6059 | 3月20日 | 265分の45 | マップ |
あなたが計画する能力を向上させることができれば、エンド見るために「計画的学習の時間」と「実際の学習時間」を記録してみてください。この研究は、非常に重要な仕事であるにも便利です。
推定式消費:Y = X + X / N 、Y = XX / Nを、 より頻繁に訓練し、X、Yが閉じます。
参考:なぜ推定されているソフトウェアエンジニアリングソフトウェア一生懸命、ソフトウェアエンジニアリングの推定法
プランの学習時間:30時間
実際の学習時間:45時間
状況改善するには:
今週は、濃縮物に他の多くは、データ構造を研究し、Javaの学習にはありません。