Tải bản đầy đủ (.pdf) (53 trang)

báo cáo thực ành môn kỹ thuật lập trình it3040 bài thực hành số 4 tuần 38 data structure

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (6.01 MB, 53 trang )

<span class="text_page_counter">Trang 1</span><div class="page_container" data-page="1">

BÁO CÁO THỰCHÀNH

<b>KỸ THUẬT LẬPTRÌNH – IT3040</b>

BÀI THỰC HÀNH SỐ 4 – TUẦN 38

<b>DATA STRUCTURE</b>

<b>IT3040 – 2022.2 – Mã lớp TH: 727639</b>

</div><span class="text_page_counter">Trang 2</span><div class="page_container" data-page="2">

Mục lục

<b>Bài 4.1: Đảo ngược một danh sách liên kết đơn...4Bài 4.2: Một điểm trong không gian 2 chiều được biểu diễn bằng pair. Hãy viết hàm tính diện tích tam giác theo tọa độ 3 đỉnh...8Bài 4.3: Một vector trong không gian 3 chiều được biểu diễn bằng tuple<double, double, double>. Hãy viết hàm tính tích có hướng </b>

của 2 vector...10

<b>Bài 4.4: Cho hai std::vector, hãy xóa hết các phần tử chẵn, sắp xếp </b>

giảm dần các số trong cả 2 vector và trộn lại thành một vector cũng được sắp xếp giảm dần...12

<b>Bài 4.5: Viết hàm void dfs(vector< list<int> > adj) thực hiện thuật </b>

tốn DFS khơng sử dụng đệ quy trên đồ thị biểu diễn bằng danh sách kề...17

<b>Bài 4.6: Viết hàm void bfs(vector< list<int> > adj) thực hiện thuật </b>

toán BFS không sử dụng đệ quy trên đồ thị biểu diễn bằng danh sách kề...20

<b>Bài 4.7: Viết các hàm thực hiện các phép giao và hợp của hai tập hợp </b>

được biểu diễn bằng set...22

<b>Bài 4.8: Viết các hàm thực hiện các phép giao và hợp của hai tập hợp </b>

mờ được biểu diễn bằng map...24

<b>Bài 4.9: Cài đặt thuật tốn Dijkstra trên đồ thị vơ hướng được biểu </b>

diễn bằng danh sách kề sử dụng std::priority_queue...27

<b>Bài 4.10: Xây dựng một máy tìm kiếm (search engine) đơn giản.Cho </b>

N văn bản và Q truy vấn. Với mỗi truy vấn, cần trả về văn bản khớp với truy vấn đó nhất.Sử dụng phương pháp tính điểm TF-IDF...30

<b>Bài 4.11: Bức tường bao quanh một lâu đài nọ được cấu thành từ n </b>

đoạn tường được đánh số từ 1 đến n. Quân giặc lên kế hoạch tấn cônglâu đài bằng cách gửi ai tên giặc đánh vào đoạn tường thứ i. Để bảo vệ lâu đài có tất cả s lính...40

<b>Bài 4.12: Cho một lược đồ gồm n cột chữ nhật liên tiếp nhau có </b>

chiều rộng bằng 1 và chiều cao lần lượt là các số nguyên không âm h1,h2,…,hn. Hãy xác định hình chữ nhật có diện tích lớn nhất có thể tạo thành từ các cột liên tiếp...46

<b>IT3040 – 2022.2 – Mã lớp TH: 727639</b>

</div><span class="text_page_counter">Trang 3</span><div class="page_container" data-page="3">

<b>Bài 4.13: Cho một xâu nhị phân độ dài n. Hãy viết chương trình đếm </b>

số lượng xâu con chứa số ký tự 0 và số ký tự 1 bằng nhau...48

<b>Bài 4.1: Đảo ngược một danh sách liên kết đơn</b>

<b>IT3040 – 2022.2 – Mã lớp TH: 727639</b>

</div><span class="text_page_counter">Trang 4</span><div class="page_container" data-page="4">

// Trần Đức Hoàng Anh 20215527// Đảo ngược sanh sách liên kết đơn#include <iostream>

using namespace std;struct Node { int data; Node* next; Node(int data) {

<b>IT3040 – 2022.2 – Mã lớp TH: 727639</b>

</div><span class="text_page_counter">Trang 5</span><div class="page_container" data-page="5">

this->data = data; next = NULL; }

// print the list content on a linevoid print(Node* head) { struct Node* temp = head; while (temp != NULL) { cout << temp->data << " "; temp = temp->next; }

// return the new head of the reversed listNode* reverse(Node* head) {

Node* current = head;

Node *prev = NULL, *next = NULL; while (current != NULL) {

head = prev;

<b>IT3040 – 2022.2 – Mã lớp TH: 727639</b>

</div><span class="text_page_counter">Trang 6</span><div class="page_container" data-page="6">

return head;}

int main() { int n, u; cin >> n;

Node* head = NULL; for (int i = 0; i < n; ++i){ cin >> u;

head = prepend(head, u); }

cout << "Reversed list: "; print(head);

return 0; }

<b>IT3040 – 2022.2 – Mã lớp TH: 727639</b>

</div><span class="text_page_counter">Trang 7</span><div class="page_container" data-page="7">

<b>Bài 4.2: Một điểm trong không gian 2 chiều được biểu diễn bằngpair. Hãy viết hàm tính diện tích tam giác theo tọa độ 3 đỉnh.</b>

Code

// Trần Đức Hoàng Anh 20215527double area (Point a, Point b, Point c){

double first_edge = sqrt((b.first-a.first)*(b.first-a.first) +(b.second - a.second)*(b.second - a.second));

<b>IT3040 – 2022.2 – Mã lớp TH: 727639</b>

</div><span class="text_page_counter">Trang 8</span><div class="page_container" data-page="8">

double second_edge = sqrt((c.first-b.first)*(c.first-b.first) +(c.second - b.second)*(c.second - b.second));

double third_edge = sqrt((a.first-c.first)*(a.first-c.first) +(a.second - c.second)*(a.second - c.second));

double p = (first_edge + second_edge + third_edge)/2; return sqrt(p*(p-first_edge)*(p-second_edge)*(p-third_edge));};

<b>Bài 4.3: Một vector trong không gian 3 chiều được biểu diễn </b>

bằng <b>tuple<double, double, double>.</b> Hãy viết hàm tính tích có hướng của 2 vector.

<b>IT3040 – 2022.2 – Mã lớp TH: 727639</b>

</div><span class="text_page_counter">Trang 10</span><div class="page_container" data-page="10">

get<1>(result) = get<2>(a)*get<0>(b) - get<0>(a) * get<2>(b);

get<2>(result) = get<0>(a)*get<1>(b) - get<1>(a) * get<0>(b);

return result;}

<b>Bài 4.4: Cho hai std::vector, hãy xóa hết các phần tử chẵn, sắp </b>

xếp giảm dần các số trong cả 2 vector và trộn lại thành một vector cũng được sắp xếp giảm dần.

<b>IT3040 – 2022.2 – Mã lớp TH: 727639</b>

</div><span class="text_page_counter">Trang 11</span><div class="page_container" data-page="11">

<b>IT3040 – 2022.2 – Mã lớp TH: 727639</b>

</div><span class="text_page_counter">Trang 12</span><div class="page_container" data-page="12">

<b>IT3040 – 2022.2 – Mã lớp TH: 727639</b>

</div><span class="text_page_counter">Trang 13</span><div class="page_container" data-page="13">

Code

// Cho hai std::vector,

// hãy xóa hết các phần tử chẵn, sắp xếp giảm dần các số trong cả 2 vector

// và trộn lại thành một vector cũng được sắp xếp giảm dần.#include <iostream>

#include <vector>#include <algorithm>using namespace std;

void print_vector(const vector<int> &a) { for (int v : a) cout << v << ' ';

cout << endl;}

void delete_even(vector<int> &a) { for (auto i = a.begin(); i != a.end(); ++i) {

if (*i % 2 == 0) { a.erase(i); i--; } }}

void sort_decrease(vector<int> &a) { sort(a.begin(), a.end(), greater<int>());}

vector<int> merge_vectors(const vector<int> &a, const vector<int> &b) {

vector<int> v(a.size() + b.size()); vector<int>::iterator it, st; it = set_union(a.begin(), a.end(),

<b>IT3040 – 2022.2 – Mã lớp TH: 727639</b>

</div><span class="text_page_counter">Trang 14</span><div class="page_container" data-page="14">

b.begin(), b.end(), v.begin());

sort(v.begin(), v.end(), greater<int>());

return v;}

int main() { int m, n, u;

std::vector<int> a, b;

std::cin >> m >> n; for(int i = 0; i < m; i++){ std:: cin >> u; a.push_back(u); }

for(int i = 0; i < n; i++){ std:: cin >> u; b.push_back(u); }

</div><span class="text_page_counter">Trang 15</span><div class="page_container" data-page="15">

print_vector(b);

vector<int> c = merge_vectors(a, b); cout << "Decreasingly sorted c: "; print_vector(c);

return 0;}

<b>IT3040 – 2022.2 – Mã lớp TH: 727639</b>

</div><span class="text_page_counter">Trang 16</span><div class="page_container" data-page="16">

<b>Bài 4.5: Viết hàm void dfs(vector< list<int> > adj) thực hiện </b>

thuật tốn DFS khơng sử dụng đệ quy trên đồ thị biểu diễn bằng danh sách kề.

<b>IT3040 – 2022.2 – Mã lớp TH: 727639</b>

</div><span class="text_page_counter">Trang 17</span><div class="page_container" data-page="17">

while(!S.empty()) {

int u = S.top();

<b>IT3040 – 2022.2 – Mã lớp TH: 727639</b>

</div><span class="text_page_counter">Trang 18</span><div class="page_container" data-page="18">

if(!visited[u]) {

visited[u] = true;

std::cout<<u<<std::endl; }

if(!adj[u].empty()) {

int v = adj[u].front(); adj[u].pop_front(); if(!visited[v]) {

S.push(v); }

} else {

S.pop(); }

}}

<b>IT3040 – 2022.2 – Mã lớp TH: 727639</b>

</div><span class="text_page_counter">Trang 19</span><div class="page_container" data-page="19">

<b>Bài 4.6: Viết hàm void bfs(vector< list<int> > adj) thực hiện </b>

thuật tốn BFS khơng sử dụng đệ quy trên đồ thị biểu diễn bằng danh sách kề.

<b>IT3040 – 2022.2 – Mã lớp TH: 727639</b>

</div><span class="text_page_counter">Trang 20</span><div class="page_container" data-page="20">

<b>IT3040 – 2022.2 – Mã lớp TH: 727639</b>

</div><span class="text_page_counter">Trang 21</span><div class="page_container" data-page="21">

visited[1] = true; while(!Q.empty()) {

int u = Q.front(); Q.pop();

cout << u << "\n"; for(auto v : adj[u]) {

if(!visited[v]) {

visited[v] = true; Q.push(v); }

} }}

<b>IT3040 – 2022.2 – Mã lớp TH: 727639</b>

</div><span class="text_page_counter">Trang 22</span><div class="page_container" data-page="22">

<b>Bài 4.7: Viết các hàm thực hiện các phép giao và hợp của hai tập</b>

hợp được biểu diễn bằng set

<b>IT3040 – 2022.2 – Mã lớp TH: 727639</b>

</div><span class="text_page_counter">Trang 23</span><div class="page_container" data-page="23">

<b>IT3040 – 2022.2 – Mã lớp TH: 727639</b>

</div><span class="text_page_counter">Trang 24</span><div class="page_container" data-page="24">

if(b.count(*it)) result.insert(*it); }

return result;}

<b>IT3040 – 2022.2 – Mã lớp TH: 727639</b>

</div><span class="text_page_counter">Trang 25</span><div class="page_container" data-page="25">

for (auto it = b.begin(); it != b.end(); ++it) result.insert(*it);

return result;}

<b>Bài 4.8: Viết các hàm thực hiện các phép giao và hợp của hai tập</b>

hợp mờ được biểu diễn bằng map.

<b>IT3040 – 2022.2 – Mã lớp TH: 727639</b>

</div><span class="text_page_counter">Trang 26</span><div class="page_container" data-page="26">

<b>IT3040 – 2022.2 – Mã lớp TH: 727639</b>

</div><span class="text_page_counter">Trang 27</span><div class="page_container" data-page="27">

result[p.first] = max(result[p.first], p.second); }

else {

result.insert(p); }

}

return result;}

const auto it = b.find(p.first); if(it != b.end())

<b>IT3040 – 2022.2 – Mã lớp TH: 727639</b>

</div><span class="text_page_counter">Trang 28</span><div class="page_container" data-page="28">

<b>Bài 4.9: Cài đặt thuật tốn Dijkstra trên đồ thị vơ hướng được </b>

biểu diễn bằng danh sách kề sử dụng std::priority_queue

<b>IT3040 – 2022.2 – Mã lớp TH: 727639</b>

</div><span class="text_page_counter">Trang 29</span><div class="page_container" data-page="29">

<b>IT3040 – 2022.2 – Mã lớp TH: 727639</b>

</div><span class="text_page_counter">Trang 30</span><div class="page_container" data-page="30">

while (!Q.empty()) { int u = Q.top().second; Q.pop();

for (const pair<int, int> &e : adj[u]) { int v = e.first;

int w = e.second;

<b>IT3040 – 2022.2 – Mã lớp TH: 727639</b>

</div><span class="text_page_counter">Trang 31</span><div class="page_container" data-page="31">

if (dist[v] > dist[u] + w) { dist[v] = dist[u] + w; Q.push({dist[v], v}); }

} }

return dist;}

<b>Bài 4.10: Xây dựng một máy tìm kiếm (search engine) đơn </b>

giản.Cho N văn bản và Q truy vấn. Với mỗi truy vấn, cần trả về văn bản khớp với truy vấn đó nhất.Sử dụng phương pháp tính điểm TF-IDF.

<b>IT3040 – 2022.2 – Mã lớp TH: 727639</b>

</div><span class="text_page_counter">Trang 32</span><div class="page_container" data-page="32">

<b>IT3040 – 2022.2 – Mã lớp TH: 727639</b>

</div><span class="text_page_counter">Trang 33</span><div class="page_container" data-page="33">

<b>IT3040 – 2022.2 – Mã lớp TH: 727639</b>

</div><span class="text_page_counter">Trang 34</span><div class="page_container" data-page="34">

<b>IT3040 – 2022.2 – Mã lớp TH: 727639</b>

</div><span class="text_page_counter">Trang 35</span><div class="page_container" data-page="35">

<b>IT3040 – 2022.2 – Mã lớp TH: 727639</b>

</div><span class="text_page_counter">Trang 36</span><div class="page_container" data-page="36">

#include<bits/stdc++.h>using namespace std;

<b>IT3040 – 2022.2 – Mã lớp TH: 727639</b>

</div><span class="text_page_counter">Trang 37</span><div class="page_container" data-page="37">

while (!str.empty()){

string tmp = str.substr(0, str.find(",")); int pos = tmp.find(" ");

if(pos > tmp.size()) vt.push_back(tmp); else {

while(pos <= tmp.size()){ tmp.erase(pos,1); pos = tmp.find(" "); }

vt.push_back(tmp); }

if (str.find(",") > str.size()){ break;

} else {

str.erase(0, str.find(",") + 1); }

} return vt;}

<b>IT3040 – 2022.2 – Mã lớp TH: 727639</b>

</div><span class="text_page_counter">Trang 38</span><div class="page_container" data-page="38">

// inputvoid input(){

vector<string> document_train; vector<string> document_test; cin >> n;

string str_tmp; getline(cin, str_tmp); for(int i=0; i<n; i++){ string str_tmp; getline(cin, str_tmp);

document_train.push_back(str_tmp); }

cin >> q;

getline(cin, str_tmp); for(int i=0; i<q; i++){ string str_tmp; getline(cin, str_tmp);

document_test.push_back(str_tmp); }

for(string v : document_train){

vector<string> element = split_string(v); vector_train.push_back(element); }

for(string v : document_test){

vector<string> element = split_string(v); vector_test.push_back(element);

}}

<b>IT3040 – 2022.2 – Mã lớp TH: 727639</b>

</div><span class="text_page_counter">Trang 39</span><div class="page_container" data-page="39">

// preprocessingvoid pre_processing(){

// tinh tan suat tu xuat hien nhieu nhat trong van ban i for(vector<string> str_tmp : vector_train){

m.insert({word_tmp, 1}); } else {

ite->second += 1; }

max_f = max(m[word_tmp], max_f); }

f_max.push_back(max_f); }

// tinh xem word xuat hien bao nhieu lan trong van ban iint frequence_word_int_document_i(string word, int i){ if(fe.find({word, i}) != fe.end()){ // neu da co trong kho luu tru thi lay ra va tra ve

return fe[{word, i}]; }

int index = 0;

vector<string> str_tmp = vector_train[i]; for(string v : str_tmp){

<b>IT3040 – 2022.2 – Mã lớp TH: 727639</b>

</div><span class="text_page_counter">Trang 40</span><div class="page_container" data-page="40">

if(word == v) index++; }

fe.insert({{word, i}, index}); return index;

// tinh xem tu word nam trong bao nhieu van ban

int count_document_contain_word(string word){ // neu da co trong kho luu tru thi lay ket qua va tra ve

if(df.find(word) != df.end()){ return df[word];

} }

df.insert({word,index}); return index;

// du doan van ban

int search_engine(vector<string> list_word){ double score_max = -1000;

int predict_label = -1; for(int i=0; i<n; i++){

vector<string> list_word_train_doc = vector_train[i]; double score = 0;

<b>IT3040 – 2022.2 – Mã lớp TH: 727639</b>

</div><span class="text_page_counter">Trang 41</span><div class="page_container" data-page="41">

for(string word : list_word){

if(find(list_word_train_doc.begin(),

list_word_train_doc.end(), word) == list_word_train_doc.end()){ // tu nay khong xuat hien trong van ban

continue; } else {

int ftd = frequence_word_int_document_i(word, i); int dft = count_document_contain_word(word); int maxfd = f_max[i];

double tf_word = 0.5 + 0.5 * ((double) ftd / maxfd); double idf_word = log2((double) n / dft);

score += tf_word * idf_word; }

}

if(score > score_max) { predict_label = i; score_max = score; }

}

return predict_label + 1;}

int main(){

ios_base::sync_with_stdio(false); cin.tie(NULL); input();

pre_processing(); for(int i=0; i<q; i++)

cout << search_engine(vector_test[i]) << endl; return 0;

<b>IT3040 – 2022.2 – Mã lớp TH: 727639</b>

</div><span class="text_page_counter">Trang 42</span><div class="page_container" data-page="42">

<b>IT3040 – 2022.2 – Mã lớp TH: 727639</b>

</div><span class="text_page_counter">Trang 43</span><div class="page_container" data-page="43">

<b>Bài 4.11: Bức tường bao quanh một lâu đài nọ được cấu thành từ</b>

n đoạn tường được đánh số từ 1 đến n. Quân giặc lên kế hoạch tấn công lâu đài bằng cách gửi ai tên giặc đánh vào đoạn tường thứ i. Để bảo vệ lâu đài có tất cả s lính.

<b>IT3040 – 2022.2 – Mã lớp TH: 727639</b>

</div><span class="text_page_counter">Trang 44</span><div class="page_container" data-page="44">

<b>IT3040 – 2022.2 – Mã lớp TH: 727639</b>

</div><span class="text_page_counter">Trang 45</span><div class="page_container" data-page="45">

<b>IT3040 – 2022.2 – Mã lớp TH: 727639</b>

</div><span class="text_page_counter">Trang 46</span><div class="page_container" data-page="46">

#include <bits/stdc++.h>using namespace std;

// Trần Đức Hoàng Anh 20215527struct data

{ int ai; int ki;

data(int ai, int ki) {

this->ai = ai; this->ki = ki; }

struct compare{

bool operator()(data a, data b) {

int ra, rb; if (a.ai <= a.ki) ra = a.ai; else ra = a.ki; if (b.ai <= b.ki) rb = b.ai; else rb = b.ki; return ra < rb; }

int n, s, kill_enemy, total_enemy;

priority_queue<data, vector<data>, compare> p_q;

<b>IT3040 – 2022.2 – Mã lớp TH: 727639</b>

</div><span class="text_page_counter">Trang 47</span><div class="page_container" data-page="47">

void input(){

cin >> n >> s; kill_enemy = 0; total_enemy = 0; for (int i = 0; i < n; i++) {

int tmp1, tmp2; cin >> tmp1 >> tmp2; total_enemy += tmp1; p_q.push(data(tmp1, tmp2)); }

void solve(){

while (!p_q.empty() && s > 0) {

data inf = p_q.top(); p_q.pop();

if (inf.ai <= inf.ki) {

kill_enemy += inf.ai; }

else {

int nenemy = inf.ai - inf.ki; p_q.push(data(nenemy, inf.ki)); kill_enemy += inf.ki;

} s -= 1; }}

<b>IT3040 – 2022.2 – Mã lớp TH: 727639</b>

</div><span class="text_page_counter">Trang 48</span><div class="page_container" data-page="48">

int main(){

input(); solve();

cout << total_enemy - kill_enemy; return 0;

// Trần Đức Hoàng Anh 20215527

<b>IT3040 – 2022.2 – Mã lớp TH: 727639</b>

</div><span class="text_page_counter">Trang 49</span><div class="page_container" data-page="49">

<b>Bài 4.12: Cho một lược đồ gồm n cột chữ nhật liên tiếp nhau có </b>

chiều rộng bằng 1 và chiều cao lần lượt là các số nguyên không âm h1,h2,…,hn. Hãy xác định hình chữ nhật có diện tích lớn nhấtcó thể tạo thành từ các cột liên tiếp.

<b>IT3040 – 2022.2 – Mã lớp TH: 727639</b>

</div><span class="text_page_counter">Trang 50</span><div class="page_container" data-page="50">

#include <bits/stdc++.h>

<b>IT3040 – 2022.2 – Mã lớp TH: 727639</b>

</div><span class="text_page_counter">Trang 51</span><div class="page_container" data-page="51">

using namespace std;

// Trần Đức Hoàng Anh 20215527int main() {

int n; cin >> n; vector<int> h(n);

for (int i = 0; i < n; i++) { h.push_back(1000); }

int ans = 0; stack<int> st; h.push_back(0);

for (int i = 0; i < h.size(); i++) {

while (!st.empty() && h[st.top()] >= h[i]) { int height = h[st.top()];

cout << ans << endl; return 0;

<b>IT3040 – 2022.2 – Mã lớp TH: 727639</b>

</div><span class="text_page_counter">Trang 52</span><div class="page_container" data-page="52">

<b>Bài 4.13: Cho một xâu nhị phân độ dài n. Hãy viết chương trình </b>

đếm số lượng xâu con chứa số ký tự 0 và số ký tự 1 bằng nhau.

#include <bits/stdc++.h>using namespace std;

// Trần Đức Hoàng Anh 20215527int main() {

string s; cin >> s;

<b>IT3040 – 2022.2 – Mã lớp TH: 727639</b>

</div>

×