20182301 2019-2020-1 "객체 지향 프로그래밍 및 데이터 구조"열 번째 주 학습 요약
내용 요약 학습
구성을 나타내는 구성도
- 정점 (정점) A와 데이터 요소 드로잉
사이드 (에지) : A와,이 정점을 연결 그리기 라인
- G = (V, E) 或者 G = (V (G), E (G))
- V (G)는 모든 정점들의 세트의 구성을 나타내고, 정점은 다른 번호 또는 문자로 표시 할 수있다. E (G)는 그래프 구조의 모든 에지들의 집합이고, 각각의 측면은 두 개의 정점을 연결로 표시된다.
도 구성 정점 세트 V (G)가 비어 있지 않은 정점을 포함해야하고, 구성 설정을 나타내는 측면도에는 가장자리를 보여주는, 비어있을 수도있다.
기본 개념지도
- 무향 그래프
구조의 관점에서, 모서리 모두에는 방향이 없다면, 이것은 그것 무향 그래프라고지도. 같은도에 도시 된 전형적인 II 무향 그래프. 필요하지 않을 때는 그림에서 아무 무 지향성 가장자리 때문에, 우리는 정점의 순서의 두 가지 측면을 나타냅니다. 예를 들어, 정점과 정점 V5 사이 VI 가장자리 (V2, V6)으로, 그것은 (V6, V2)와 같이 표현 될 수있다 표현 될 수있다.
- 감독 그래프
구조를 도시 한 도면은, 가장자리는이도 III에 도시도 유향 그래프라고 방향성이다. 주문이 두 정점을 요구했을 때, 그래프의 에지 방향성 때문에, 우리는 모서리를 나타낸다. 우리 각괄호 예컨대 관한 에지를 나타내는 사용 <V2, V6>는 정점 V2의 정점에서 V6를 나타내고, <V6, V2> V6가 정점 V2에 정점을 나타낸다.
- 학위 정점
- 정점의 정점을 연결하는 에지들의 개수가 언급. 유향 그래프의 다른 정점 및 거기 무향 그래프 데. 무향 그래프를 들어, V의 정점 D (V)로 언급 정점에 연결된 에지의 수이며, 이는 상대적으로 간단하다.
- 이중 음자 약간 더 복잡 할 경우, 정점 V 접속 측의 지향성에있어서, 정점 점 정도의 침투 정도가있다.
- 이 ID (V)로 언급 엔드 포인트 수의 측면의 정점이다.
- 정점의 정도 OD (V)로 언급 에지 포인트들의 수이다.
- 인접 행렬
- 참조하는 두 개의 인접한 꼭지점도 에지 구조의 정점이다. 다른 인접한 꼭지점에게 유향 그래프와 거기 무향 그래프 데. 무향 그래프 인접한 꼭지점은 비교적 간단하다.
- 이중 음자 약간 더 복잡 할 경우, 정점 V 접속 측의 지향성에있어서, 두 정점 시작 정점 (원점 또는 시작점) 및 최종 정점 (엔드 포인트)로 지칭된다. 거기는 그래프의 정점에 인접한 두 가지 범주로 나누어진다 :
- 정점 가장자리에 인접 : 초기 정점의 정점을 연결하는 가장자리. 예를 들어, 조성물 <V2, V6>이 에지의 두 정점 V2는 인접하는 에지의 정점 V6이다.
- 인접한 꼭지점 가장자리 : 정점의 끝 가장자리에 연결된 정점. 예를 들어, 조성물 <V2는 V6>이 에지의 두 정점 V6는 에지 인접 정점 V2이다.
- 무향 전체 그래프
각각 두 꼭지점 사이의 수치는 자유 가장자리의 존재하는 경우,이 구조는 완전한 그래프도 방향성이 언급된다. 도 IV에 나타낸 대표적인 완전한 무향 그래프.
- 완전한 무향 그래프 M 가장자리 M (M-1) / (2)의 전체 수의 정점이 포함되어 이론적으로 입증 할 수있다. 예를 들어, 에지의 수는도 4 개이고. 5 (5-1) / 2 = 10.
- 감독 완전한 그래프
유향 그래프의 경우,이 구조는도 지칭되는 두 정점 사이의 각 에지에 대향하는 두 방향은 완전도가 관한 것이다. V.도에 도시 된 바와 같이 전형적인, 전체 그래프를 지시
- 이론적 N 정점 완전한 그래프이다 함유 들면 증명할 수, 에지의 수는 N (N-1)이다. 양측이 각각 두 꼭지점 사이의 필요 때문에,이 잘 이해되고, 배 전체 무향 그래프이다.
- 방향성 비순환 그래프 (DAG FIG)
- 여러 측면이 점에 백업을 통해 정점 방향 그래프에서 출발이없는 경우,이 그래프는 방향성 비순환 그래프이다.
- 방향성 비순환 그래프는 블록 사슬 분야에 사용될 수있다.
- 차트 오른쪽과지도를받을 수 없음
본원 오른쪽 에지 노드와 노드 사이의 이러한 측면이도 특정 값을받을되지 않는다 들면 대응하는 수치 값을 갖는지 인 값으로 이해 될 수있다. 오른쪽 노드와 노드 사이도 관계 에지 값은 시간이되도록, 이러한 하나 개의 정점 또는 시간에 다른 정점 두 꼭지점 사이의 거리의 수치를 대표하는 값을 나타내는 데 요구 될 수있다 . 그것은도도 오른쪽이라고 두 노드 사이의 관계를 나타내고;
- 연결 그래프
그래프의 각 노드는 각각의 노드가 반드시 있으므로 아래와 같이 본도 연결을 포함한다는 것이다 접속 에지되지 않는다 :
- 이 그림이 완전히 연결되지 않은에서 위의를 찾을 수 있습니다.
- 도의 간단한 (단순 그래프)
- 노드 사이에 두 개의 노드와 가장자리, 특수의 두 반대편이 있습니다 들어
- 림 (자기 루프) 이후 : 에지 노드 자체가 자신을 가리키는.
- 평행선 (병렬 에지) : 두 노드 사이에 접속하는 다수의 에지의 존재.
양측은이 상황을 병렬 측면을 사용할 수 있도록, 이러한 세 방법으로, 도로가 없을 수 있습니다 도시 B에 도시 A로부터 같은 의미가있다. 그러나, 알고리즘 디자인에 양측은 달성하기가 더 어렵습니다. 그림은 단순히 양쪽을 고려하지 않습니다.
일반적인 그래프 알고리즘
- 너비 우선 탐색
- 탐색 방법 : 반경 광역 주위 시작 정점으로부터 제 순회
- 방법 : 순서를 보유하는 큐의 필요성 액세스에 인접 정점의 정점을 순서를 대기열에서 이동 통과해서 지정
- 최고 의사 :
- 방문으로 초기 액세스 노드는 노드 V 및 v 레이블.
- 노드 큐 V
- 큐가 비어 있지 않은 경우, 그렇지 않으면 알고리즘 끝을 계속합니다.
- 큐는 HOL U가 노드 얻었다.
- w 제 1 인접 노드에서 노드 U를 찾는다.
- 인접 노드 w 노드 u는 3 단계로 이동 존재하지 않는 경우, 그렇지 않으면, 세 단계에 따라주기 :
- 아직 w 노드가 액세스 한 경우 방문으로, 액세스 노드는 W 및 표시.
- w 노드 큐
- 인접 노드를 다음 w 노드 U에 w 다음 인접한 노드 찾기, 6 단계로 이동합니다.
- 콘텐츠 해석 : 1-> 2-> 3-> 4 -> 5> 6> 7-> 8 인 알고리즘의 너비 우선 탐색 순서
- 깊이 우선 탐색
- 순회 방법 : 정점에서 시작하여, 각 정점의 엣지 와이즈 탐험. (노골적 : 사용 한 방법!)
- 방법 : 저장소에 스택의 순서가 정점을 발생 횡단 고정함으로써, 다만, 노드가 큐의 첫 번째 방문하지 (때문에 그것의 반복 사용)가 아닌 스택을 얻기 위해 . 이 경우에는 인접한 정점은 다음 스택의 정점에 액세스하지 않으며,되지 않았습니다.
- 최고 의사 :
- 방문으로 초기 액세스 노드 V 및 노드 V는 표시.
- w 제 1 인접 노드는 노드 (V)를 찾는다.
- 존재하는 경우, W, 4, 그렇지 않으면 알고리즘 단부 진행.
- 접근이 아닌 경우, 승 재귀 깊이 우선 탐색을 W (즉, w (V)와 같은 다른 후 123 단계).
- 노드 다음 인접한 노드의 V 인접한 노드 승 찾기, 3 단계로 이동합니다.
- 이미지 설명 : 1-> 2-> 3-> 8> 5-> 3-> 6> 7의 깊이 우선 탐색 순서를
최단 경로 문제
- 단일 소스 최단 경로도받을 자격이되지 않습니다.
첫째, 우리가 0으로 설정되어 경로 길이의 시작점 것, 다른 정점 경로 길이는 V1에 대한 시작 지점 (범례? 분포하고, 다른 가능한 값일 수도있다) 네가티브 번호로 다음의 예를 설정
우리는 그 다음 긴, 출발 정점 포인트 경로가 확인 될 것이라는 본 실시 V3 및 V4의 경로 (1), 즉, 길이의 시작점 0 경로 길이의 정점 :
다음으로는, 우리는 경로 길이의 정점에 1 뾰족한 경로 길이 정점 (V3 및 V4)이 2로 설정됩니다, 같은 확신 할 수있는 정점 정점 1 길이 2의 경로로 지적의 경로 길이. 그러나 이번에는 문제가 발생합니다 : V3 V4는 뾰족한 정점이지만, 경로 길이 V3는 분명히 2로 설정되어서는 안된다. 우리가 "알려진"정점의 집합의 알려진 경로 길이를 필요 그래서 마크, 알려진 경로 길이는 더 이상 방법이 명시된 코드를 부여 특히, 자신의 정점을 변경하지 않습니다. 본 실시 예에서는, 경로 길이가 정점에 설정되는 2 V2, V5, V6 인
- 규칙은 : 정점 나 미지 경로 길이에 관한 것이다 정점의 경로 길이 I + 1, I 0, 즉 종료 조건 : 전류 경로 길이가 다른 버텍스 I 정점 또는 정점이 가리키는 점을하지 않는 것이다 그것은 알려져있다.
- 참고 종료 조건은 시작 지점으로 정점을 결정한 후, 정점은 우리의 예에서와 같이, 도달 할 수없는부터 다음 거기 출발점이 될 및 수 있기 때문에 우리는 모든 정점이 알려져 요구하지 않았다, 말을하는 것이 V0 경로에서 V0에 V1은 존재하지 않습니다.
최단 경로의 계산 결과는 다음과 같이 구성되는 선형 테이블에 저장된다 :
알려진 경우 정점, 최단 경로 길이의 시작점 자체 꼭지점 정면에서 최단 경로 : "선"은 테이블의 선형 소자, 셀의 각 행은 네 개의 요소 네 도메인이다.
- 최단 경로 표 나타내는 프로세스 전에 계산되는, 이것은 다음과 같다 :
- 간단한 의사 코드
//无权最短路径计算,图存于邻接表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) 나열합니다. FOUND 다음의 거리를 수정하면 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 세, v4.distance = v1.distance + = 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가 두 개의 서브 - 경로를 함축하는 도면 같이 유향 그래프에있다 : 경로의 관점에서 이전에있어서, V0-V1-V4 및 V4-V3-V0, 정렬 V0 마스트의 선행 V4의 결과와 위상 정렬 만 비순환 그래프에 이용 될 수 있도록, 또한 명백하게 모순 경로, V4에 선행해야 V0의 조건에 따라.
- 이 개 기능은 비순환 그래프 감독이있다 :
- 도는 비순환 향하는 경우, 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 해결 방법 :
- 접근이 채용 스택 비 재귀 깊이 우선 탐색 비 - 반복적 접근법을 사용하면 첫 번째 통과를 폭 큐
- 깊이 우선 탐색은 멀리에 도착하지 않는 각 지점에 깊이 이동하는 것입니다. 선주문 특히 선주문, postorder있다; 또한 아래쪽으로 통과 위에서 층에 의해 제 순회 탐색 시퀀스 층이라고도
- 질문 3 : 웹 크롤러의 깊이 우선 탐색과 관련, 자세히 살펴
- 질문 3 해결 방법 :
- (또한 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 | 일반적인 클래스 |
넷째 주 | 1,300분의 300 | 2/7 | 80분의 25 | JUnit 테스트 및 쓰기 수업 |
다섯째 주 | 3,563분의 2,665 | 2/9 | 110분의 30 | 원격와 인터페이스 |
여섯째 주 | 4,671분의 1,108 | 1/10 | 135분의 25 | 다형성 및 이상 |
주 세븐 | 6,617분의 1,946 | 3/13 | 160분의 25 | 스택, 큐 |
여덟 번째 주 | 7,448분의 831 | 1/14 | 185분의 25 | 정렬 찾기 |
주 나인 | 13,507분의 6,059 | 3/17 | 220분의 35 | 이진 검색 트리 |
열 번째 주 | 13,507분의 6,059 | 3/20 | 265분의 45 | 지도 |
당신이 계획 능력을 향상시킬 수있는 경우 최종 확인하려면 "계획된 학습 시간"과 "실제 학습 시간"을 기록하십시오. 이 연구는 매우 중요한 작품이다 유용합니다.
추정 식 소비 : Y = X + X / N , Y = XX / N, 훈련 더 자주, X를, Y가 닫히고.
참조 : 왜 추정되는 소프트웨어 엔지니어링 소프트웨어 열심히 , 소프트웨어 공학 추정 방법
계획 연구 시간 : 30시간
실제 공부 시간 : 45시간
: 상황을 개선하기 위해
많은 다른 농축에, 자바를 학습 데이터 구조를 공부에가되지 않습니다 주.