XÁC ĐỊNH ĐỘ PHỨC TẠP THUẬT TOÁN

Cách tính độ phức tạp của một số giải thuật đơn giản.
QUY TẮC XÁC ĐỊNH ĐỘ PHỨC TẠP
•         Độ phức tạp tính toán của giải thuật: O(f(n))
•         Việc xác định độ phức tạp tính toán của giải thuật trong thực tế có thể tính bằng một số quy tắc đơn giản sau:
–        Quy tắc bỏ hằng số:
            T(n) = O(c.f(n)) = O(f(n)) với c là một hằng số dương
–        Quy tắc lấy max:
            T(n) = O(f(n)+ g(n)) = O(max(f(n), g(n)))
–         Quy tắc cộng:
            T1(n) = O(f(n))                     T2(n) = O(g(n))
            T1(n) + T2(n) = O(f(n) + g(n))
–         Quy tắc nhân:
            Đoạn chương trình có thời gian thực hiện T(n)=O(f(n))
            Nếu thực hiện k(n) lần đoạn chương trình với k(n) = O(g(n)) thì độ phức tạp sẽ là O(g(n).f(n))

PHÉP TOÁN TÍCH CỰC (BEST PROXY)
•         Trong một thuật toán, ta chú ý đặc biệt đến một phép toán gọi là phép toán tích cực. Đó là phép toán mà số lần thực hiện không ít hơn các phép toán khác
•         Ví dụ 1:
s = 0;
for (i=0; i<=n;i++){
            p =1;
            for (j=1;j<=i;j++)
                        p=p * x / j;
            s = s+p;
}
Phép toán tích cực là p = p * x / j
Số lần thực hiện phép toán này là
            0+1+2+…+n = n(n-1)/2 = n2/2 – n/2
=> Vậy độ phức tạp là O(n2/2 – n/2)
= O(n2/2)       sử dụng quy tắc lấy max
= O(n2)           sử dụng quy tắc bỏ hằng số
           
•         Ví dụ 2:
s = 1; p = 1;
for (i=1;i<=n;i++) {
            p = p * x / i;
            s = s + p;
}
Phép toán tích cực là p = p * x / i
Số lần thực hiện phép toán là n
=> Vậy độ phức tạp của thuật toán là O(n)
                       
•         Ví dụ 3:
s=n*(n-1) /2;
=> Độ phức tạp của thuật toán là O(1), nghĩa là thời gian tính toán không phụ thuộc vào n
  
•         Ví dụ 4:
Thuật toán tính tổng các số từ 1 đến n     
s=0;
for (i= 1;i<=n;i++)
            s=s+i;
Vòng lặp lặp n lần phép gán s = s+i, nên thời gian tính toán tỉ lệ thuận với n, tức độ phức tạp là O(n).
=> độ phức tạp là O(n)

•         Ví dụ 5:
for (i= 1;i<=n;i++)
            for (j= 1;j<=n;j++)
                        //Lệnh
=> Dùng quy tắc nhân ta có O(n^2)
tương tự như vậy ta sẽ có O(n^3), O(n^4).

•         Ví dụ 6:
for (i= 1;i<=n;i++)
            for (j= 1;j<=m;j++)
                        //Lệnh
=> Dùng quy tắc nhân ta có O(n*m)

•         Ví dụ 7:
for (i= 1;i<=n;i++)
            //lệnh1
for (j= 1;j<=m;j++)
            //lệnh 2
=> Dùng quy tắc cộng và quy tắc lấy max, sẽ có
            O(max (n,m))

•         Ví dụ 8:         
for (i= 1;i<=n;i++) {
            for (u= 1;u<=m;u++) 
                        for (v= 1;v<=n;v++)
                                    //lệnh
            for j:= 1 to x do 
                        for k:= 1 to z do 
                                    //lệnh
}
=> O(n*max (n*m,x*z))

•         Ví dụ 9:
for (i= 1;i<=n;i++) 
            for (j= 1;j<=m;j++) {
                        for (k= 1;k<=x;k++) 
                                    //lệnh
                        for (h= 1;h<=y;h++) 
                                    //lệnh
            } 
=> O(n*m* max (x,y))

•         Ví dụ 10:
for (i= 1;i<=n;i++)
            for (u= 1;u<= m;u++)
                        for (v= 1;v<=n;v++) 
                                    //lệnh 
for (j= 1;j<=x;j++) 
                        for (k= 1;k<=z;k++) 
                                    //lệnh 
=> O(max (m*n^2,x*z)) 

•         Ví dụ 11: Đoạn chương trình tính tổng 2 đa thức
P(x) = xmxm+am-1xm-1+ …+a1x+a0
Q(x) = bnxn+bn-1xn-1+…+b1x+b0
if (m<n) p = m; else p =n;
for (i=0;i<=p;i++)
            c[i]=a[i] + b[i];
if (p<m)
            for (i=p+1;i<=m;i++) c[i] = a[i];
else
            for (i=p+1;i<=n;i++) c[i] = b[i];
while (p>0 && c[p] = 0) p = p-1;
=> Độ phức tạp: O(max(m,n))

•         Ví dụ 12: Đoạn chương trình tính tích hai đa thức
P(x) = xmxm+am-1xm-1+ …+a1x+a0
Q(x) = bnxn+bn-1xn-1+…+b1x+b0
p = m+n;
for (i=0;i<=p;i++) c[i] = 0;
for (i=0;i<=m;i++)
            for (j=0;j<=n;j++)
                        c[i+j] = c[i+j] + a[i] + b[j];
=> Độ phức tạp là O(m.n)

Sắp xếp theo chiều tăng của độ phức tạp, các độ phức tạp đặt trên cùng hàng là tương đương
            1, 2100
            log n
            n log n, log (n!)
            n2
            (log n)log n, nlog(log n)
            2n
3nn!

0 nhận xét:

Thuật toán chia để trị (Divide and conquer algorithm)

Thuật toán chia để trị (Divide and conquer algorithm)
Nội dung thuật toán:
  Ðể giải một bài toán kích thước n, ta chia bài toán đã cho thành một số bài toán con có kích thưóc nhỏ hơn. Giải các bài toán con này rồi tổng hợp kết quả lại để được lời giải của bài toán ban đầu.
  Ðối với các bài toán con, chúng ta lại sử dụng kỹ thuật chia để trị để có được các bài toán kích thước nhỏ hơn nữa. Quá trình trên sẽ dẫn đến những bài toán mà lời giải chúng là hiển nhiên hoặc dễ dàng thực hiện, ta gọi các bài toán này là bà itoán cơ sở
Nội dung thuật toán gồm 3 thànhphần:
- Chia: phân tích bài toán có N thành phần dữ liệu thành nhiều bài toán con có kích thước dữ liệu nhỏ hơn
- Trị: giải bài toán con bằng phương pháp đệ quy. Tuy nhiên nếu bài toán con đủ nhỏ, có thể giải quyết theo cách đơn giản
- Tổng hợp: tổng hợp nghiệm của các bài toán con thành nghiệm của bài toán ban đầu
 
o Các bài toán phổ biến sử dụng thuật toán chia để trị
1) Sắp xếp kiểu trộn (Merge sort)
2) Tìm kiếm nhị phân (Binary search)
3) Sắp xếp nhanh (Quick sort)
4) Nhân các số nguyên lớn
5) Xếp lịch thi đấu thể thao
6) Tìm phần tử lớn nhất của mảng
7) Tìm phần tử trung bình của mảng
8) Tìm dãy con có tổng lớn nhất
9) Tìm cặp điểm gần nhau nhất 
10) Phủ bàn cờ Tromino
 
Ví dụ: Sắp xếp kiểu trộn (Merge Sort)
Cho 1 dãy số M có N phần tử nguyên. Viết thuật toán sắp xếp dãy số M tăng dần
Chia: phân chia dãy N phần tử sẽ được sắp xếp thành 2 dãy con, mỗi dãy có N/2 phần tử
Trị: dùng kỹ thuật trộn 2 dãy con đã được sắp xếp thành dãy kết quả được sắp xếp. Quá trình này xảy ra khi các dãy con không thể phân chia được nữa
Tổng hợp: tổng hợp kết quả của 2 dãy con đã được sắp xếp thành dãy được sắp xếp
 
 Độ phức tạp thuật toán: O(n logn)
 
Giả sử muốn sắp xếp dãy con M có k phần tử, các phần tử có chỉ số từ low đến high 
Thuật toán sắp xếp (M, low, high) như sau:
Nếu low<high thì 
mid = (low+high)/2
Gọi đệ quy sắp xếp nửa trước của dãy M có chỉ số từ low đến mid
Gọi đệ quy sắp xếp nửa sau của dãy M có chỉ số từ mid+1 đến high
Trộn 2 dãy con tăng thành dãy ban đầu
public void sapXep(int[] M, int low; int high){
if (low<high) {
mid=(low+high) / 2;
sapXep(M, low, mid);
sapXep(M, mid+1, high);
tron(M, low, mid, high);
}
}
tron(): trộn 2 dãy con tăng thành một dãy con tăng

0 nhận xét:

Cài Đặt Đồ Họa trong codeblock


Đầu Tiên các Bạn tải file này về:
 http://www.mediafire.com/download/b253ah9mefebxsz/C%2B%2B.rar
Cài đặt Codeblock như bình thường
Sau khi đã cài đặt Code::Block và tải thư viện WinBGIm về máy tính. Các bạn làm theo các bước sau đây:
Bước 1. Giải nén file WinBGIm_Library6_0_Nov2005.rar ra một thư mục nào đó tùy ý bạn. Kết quả giải nén là 3 file: graphics.h, libbgi.a, winbgim.h
Bước 2. Copy các tập tin trên vào các thư mục như sau:
  • Đối với hệ điều hành Windows 64 bit
    • Copy 2 file graphics.h và winbgim.h vào thư mục C:\Program Files (x86)\CodeBlocks\MinGW\include
    • Copy file libbgi.a vào thư mục C:\Program Files (x86)\CodeBlocks\MinGW\lib
  • Đối với hệ điều hành Windows 32 bit
    • Copy 2 file graphics.h và winbgim.h vào thư mục C:\Program Files\CodeBlocks\MinGW\include
    • Copy file libbgi.a vào thư mục C:\Program Files\CodeBlocks\MinGW\lib
Bước 3. Mở Code::Blocks và thực hiện các bước cấu hình đồ họa:
  • Chọn menu Settings -> Compiler and debugger -> Linker settings -> Add -> Browse (dấu ...)
  • Chọn đường dẫn chứa tập tin libbgi.a
  • Nhìn qua bên tay phải, có mục Other linker options, gõ dòng lệnh sau: -lbgi -lgdi32 -lcomdlg32 -luuid -loleaut32 -lole32 
  • Kết quả cấu hình giống như hình bên dưới:

  • Click OK để tắt cửa sổ cũng như hoàn tất việc cấu hình
Bước 4. Kiểm tra thử xem có cấu hình thành công hay không bằng một chương trình đồ họa nho nhỏ.
  • Tại Code::Blocks, click menu File -> New -> Empty File (hoặc nhấn tổ hợp phím Ctrl+Shift +N) để tạo một tập tin C++ mới
  • Tiếp tục click vào File -> Save file (hoặc nhấn tổ hợp phím Ctrl+S) để đặt tên file là vidu.cpp (các bạn có thể đặt tên khác như phần mở rộng bắt buộc là .cpp, nếu không phải .cpp thì sẽ không lập trình đồ họa được)
  • Gõ đoạn code sau: click để tải vidu.cpp
  • Nhấn F9 để thực thi đoạn chương trình. Kết quả chương trình sẽ như sau:

0 nhận xét:

Game Bắn Trứng khủng long

09:01 0 Comments

Game bắn Trứng khủng long Cho pc

http://www.mediafire.com/download/rjov80d5glo15g7/Game+Ban+trung+khung+long.rar

0 nhận xét:

Trọn bộ giáo trình ĐHBK 5 năm CNTT (Tiếng Việt)

http://www.mediafire.com/?sharekey=b0c41775614117a7ab1eab3e9fa335cace636da8 e7d640f6
pas:tech24.vn

.Đồ án CNTT
.Cấu trúc máy tính
.Cơ bản
.Công nghệ phần mềm
.Đồ họa máy tính
.Giải thuật
.Giáo trình C#
.Giáo trình C,C++
.Giáo trình Java
.Hệ điều hành
.Kĩ thuật vi xử lý
.Lý thuyết hướng đối tượng
.Phân tích thiết kế hệ thống
.SQL server
.Trình biên dịch
trong mỗi phần bao gồm bài giảng,tài liệu tham khảo và đề thi tham khảo

0 nhận xét:

09:51 0 Comments

Wifi Win 8 là một dịch vụ tiện ích của win8 . Nó đem lại nhiều tiện ích cho người dùng

Hiện nay Các phần mềm phát wifi Connectify và MyPublicWiFi hoạt động rất tốt trên winxp, win7. Nhưng nó sẽ khiến máy bạn chậm đi 1 chút. Hôm nay mình xin chia sẻ với các bạn 1 cách phát wifi trên windows 8 trực tiếp mà không cần dùng phần mềm. 


Xin nói trước là nó không tiện dụng bằng phần mềm chuyên nghiệp nhưng dù sao cũng giúp bạn chủ động hơn Và hơn nữa rất dễ làm. Phát wifi trên win 8 mà không cần phần mềm. Sau đây mình sẽ hướng dẫn các bạn (chỉ 2 dòng lệnh trong cmd là xong nhé)
Đầu tiên bạn click phải chuột vào ngay góc dưới bên trái màn hình và chọn Command Prompt (Admin)

[​IMG]

Một cách khác là bạn bấm nút start rồi search từ "cmd" 

Rồi chọn Run as Administrator

Tiếp theo, trong command Prompt bạn hãy nhập vào lệnh sau đây để tạo một hostednetwork rồi nhấn enter:

netsh wlan set hostednetwork mode=allow ssid=wifi-win8 key=12345678

(bạn có thể copy rồi paste cho nhanh và chính xác)

[​IMG]

Đã tạo 1 hosted thành công. Bạn nhập tiếp dòng lệnh sau đây để phát sóng wifi rồi nhấn enter:

netsh wlan start hostednetwork

Đã phát wifi thành công.

Tiếp theo là share internet cho wifi. Bạn click phải chuột vào biểu tượng sóng không dây ở dưới thanh taskbar, bên cạnh hình chiếc loa --> chọn Open network and Sharing Center --> chọn change adapter settings. Bạn sẽ thấy xuất hiện 1 mạng không dây ảo trong Network Connections:

[​IMG]

Click phải chuột vào mạng đang được dùng để kết nối internet (adsl, wifi hoặc 3G, ở đây mình đang dùng 3G của Mobifone) --> chọn properties

[​IMG]

Trong thẻ Sharing, bạn hãy tick vào ô Allow other network users to connect through this computer’s Internet connection và ở bên dướiHome networking connection, bạn chọn tên profile vừa được tạo ra, mặc định là Local Area Connection* 12 rồi nhấn ok (phần này chỉ cài đặt 1 lần)

[​IMG]

Vậy là xong. Bạn đã phát thành công 1 hostednetwork. Để kiểm tra lại thông tin chi tiết, bạn hãy nhập dòng lệnh sau rồi nhấn enter:

netsh wlan show hostednetwork

Đã có 1 thiết bị kết nối:

[​IMG]

Còn đây là chất lượng sóng của wifi-win8, chuẩn 802.11n tốc độ truyền tải 300 Mbits/sec (win7 chỉ phát được 150 Mbits/sec), sóng khá tốt phải không bạn?

[​IMG]

Để tắt wifi, bạn nhập dòng lệnh:

netsh wlan stop hostednetwork

Để hủy bỏ 1 hosted đã tạo, bạn nhập:

netsh wlan set hostednetwork mode=disallow ssid=wifi-win8 key=12345678

Chú ý:

wifi-win8 là tên hosted có thể thay thế bằng tên khác theo ý thích của bạn
12345678 là password do bạn chọn, tối thiểu là 8 ký tự
Để nhập nhanh và chính xác dòng lệnh, bạn nên copy rồi paste vào command Prompt

Nếu muốn kiểm tra chi tiết các thiết bị đang kết nối vào mạng của bạn, tải tiện ích nhỏ này về dùng: Wireless Network Watcher_Portable

Nếu các thiết bị kết nối với mạng của bạn chỉ share được dữ liệu mà không share được internet thì bạn chỉnh như sau: Click phải chuột vào hình cột sóng không dây --> Chọn Open Network and Sharing Center --> Change advanced sharing settings --> All network --> Chọn Turn on sharing..., chọn Use 128-bit..., Chọn Turn off password...

Muốn share dữ liệu trên các ổ D, E, F...giữa các máy tính với nhau thì click phải chuột vào ổ đĩa muốn share--> chọn Properties --> chọn thẻ sharing --> chọn Advanced sharing --> tick vào ô sharing this folder rồi nhấn ok

Lời khuyên:

1. Cơ bản:
Bạn nên chép những dòng lệnh dưới đây vào notpad rồi lưu ngay trên desktop để thao tác dòng lệnh cho nhanh và chính xác bằng copy và paste:

Tạo:

netsh wlan set hostednetwork mode=allow ssid=wifi-win8 key=12345678

Phát:

netsh wlan start hostednetwork

Kiểm tra:

netsh wlan show hostednetwork

Tắt:

netsh wlan stop hostednetwork

Hủy bỏ hostednetwork đã tạo:

netsh wlan set hostednetwork mode=disallow ssid=wifi-win8 key=12345678

2. Nâng cao:
Mở trình soạn thảo notepad, chép từng dòng lệnh vào rồi lưu lại với từng file.cmd riêng như: Create.cmd (tạo), Start.cmd (Phát), Stop.cmd (Tắt),Delete.cmd (Hủy bỏ). Các file này đều chạy dưới quyền addmin nhé. Chú ý khi chép lệnh vào notepad xong cũng phải nhấn enter rồi mới save, khi save as nhớ chọn vào All Files ở hộp thoại phía dưới tên file.

3. Tải về:
Nếu ai không có thời gian làm thì tải về các file được tạo sẵn ở đây (muốn đổi tên mạng và pass thì click phải chuột vào file chọn edit, sửa xong save lại), để chạy phải chuột vào file tạo sẵn chọn Run as administrator.

0 nhận xét: