1. Trang chủ
  2. » Luận Văn - Báo Cáo

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

53 1 0
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Mục lụcBà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

Trang 1

BÁO CÁO THỰCHÀNH

KỸ THUẬT LẬPTRÌNH – IT3040

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

DATA STRUCTURE

IT3040 – 2022.2 – Mã lớp TH: 727639

Trang 2

Mục lục

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

của 2 vector 10

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

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ài 4.5: Viết hàm void dfs(vector< list<int> > adj) thực hiện thuật

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

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

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

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

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

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

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

Bài 4.9: Cài đặt thuật toán Dijkstra trên đồ thị vô hướng được biểu

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

Bài 4.10: Xây dựng một máy tìm kiếm (search engine) đơn 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 30

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

đ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ài 4.12: Cho một lược đồ gồm n cột chữ nhật liên tiếp nhau có

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

IT3040 – 2022.2 – Mã lớp TH: 727639

Trang 3

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

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

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

IT3040 – 2022.2 – Mã lớp TH: 727639

Trang 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) {

IT3040 – 2022.2 – Mã lớp TH: 727639

Trang 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;

IT3040 – 2022.2 – Mã lớp TH: 727639

Trang 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; }

IT3040 – 2022.2 – Mã lớp TH: 727639

Trang 7

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.

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));

IT3040 – 2022.2 – Mã lớp TH: 727639

Trang 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à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 của 2 vector.

IT3040 – 2022.2 – Mã lớp TH: 727639

Trang 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ài 4.4: 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.

IT3040 – 2022.2 – Mã lớp TH: 727639

Trang 11

IT3040 – 2022.2 – Mã lớp TH: 727639

Trang 12

IT3040 – 2022.2 – Mã lớp TH: 727639

Trang 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(),

IT3040 – 2022.2 – Mã lớp TH: 727639

Trang 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); }

Trang 15

print_vector(b);

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

return 0;}

IT3040 – 2022.2 – Mã lớp TH: 727639

Trang 16

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

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

IT3040 – 2022.2 – Mã lớp TH: 727639

Trang 17

while(!S.empty()) {

int u = S.top();

IT3040 – 2022.2 – Mã lớp TH: 727639

Trang 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(); }

}}

IT3040 – 2022.2 – Mã lớp TH: 727639

Trang 19

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

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

IT3040 – 2022.2 – Mã lớp TH: 727639

Trang 20

IT3040 – 2022.2 – Mã lớp TH: 727639

Trang 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); }

} }}

IT3040 – 2022.2 – Mã lớp TH: 727639

Trang 22

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 được biểu diễn bằng set

IT3040 – 2022.2 – Mã lớp TH: 727639

Trang 23

IT3040 – 2022.2 – Mã lớp TH: 727639

Trang 24

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

return result;}

IT3040 – 2022.2 – Mã lớp TH: 727639

Trang 25

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

return result;}

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 mờ được biểu diễn bằng map.

IT3040 – 2022.2 – Mã lớp TH: 727639

Trang 26

IT3040 – 2022.2 – Mã lớp TH: 727639

Trang 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())

IT3040 – 2022.2 – Mã lớp TH: 727639

Trang 28

Bài 4.9: Cài đặt thuật toán Dijkstra trên đồ thị vô hướng được

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

IT3040 – 2022.2 – Mã lớp TH: 727639

Trang 29

IT3040 – 2022.2 – Mã lớp TH: 727639

Trang 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;

IT3040 – 2022.2 – Mã lớp TH: 727639

Trang 31

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

} }

return dist;}

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

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.

IT3040 – 2022.2 – Mã lớp TH: 727639

Trang 32

IT3040 – 2022.2 – Mã lớp TH: 727639

Trang 33

IT3040 – 2022.2 – Mã lớp TH: 727639

Trang 34

IT3040 – 2022.2 – Mã lớp TH: 727639

Trang 35

IT3040 – 2022.2 – Mã lớp TH: 727639

Trang 36

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

IT3040 – 2022.2 – Mã lớp TH: 727639

Trang 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;}

IT3040 – 2022.2 – Mã lớp TH: 727639

Trang 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);

}}

IT3040 – 2022.2 – Mã lớp TH: 727639

Trang 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){

IT3040 – 2022.2 – Mã lớp TH: 727639

Trang 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;

IT3040 – 2022.2 – Mã lớp TH: 727639

Trang 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;

IT3040 – 2022.2 – Mã lớp TH: 727639

Trang 42

IT3040 – 2022.2 – Mã lớp TH: 727639

Trang 43

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

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.

IT3040 – 2022.2 – Mã lớp TH: 727639

Trang 44

IT3040 – 2022.2 – Mã lớp TH: 727639

Trang 45

IT3040 – 2022.2 – Mã lớp TH: 727639

Trang 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;

IT3040 – 2022.2 – Mã lớp TH: 727639

Trang 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; }}

IT3040 – 2022.2 – Mã lớp TH: 727639

Trang 48

int main(){

input(); solve();

cout << total_enemy - kill_enemy; return 0;

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

IT3040 – 2022.2 – Mã lớp TH: 727639

Trang 49

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

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.

IT3040 – 2022.2 – Mã lớp TH: 727639

Trang 50

#include <bits/stdc++.h>

IT3040 – 2022.2 – Mã lớp TH: 727639

Trang 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;

IT3040 – 2022.2 – Mã lớp TH: 727639

Trang 52

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

đế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;

IT3040 – 2022.2 – Mã lớp TH: 727639

Ngày đăng: 11/06/2024, 17:42

Xem thêm:

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

w