thảo luận [Học Tập] Topic thuật toán

  • Người tạo chủ đề Người tạo chủ đề unknowpc90
  • Ngày bắt đầu Ngày bắt đầu
mọi người cho mình hỏi câu tìm phần tử lớn nhất với lớn thứ 2 trong mảng thì có cách nào tối ưu và có độ phức tạp bé nhất nhỉ
[ 2 4 5 6 6 6 7 7 8 9 8 ]

Tạo 1 mảng tmp[] 2 items, duyệt 1 vòng for qua từng item trong mảng chính, thấy item đó lớn hơn tmp[0] hoặc tmp[1] thì gán nó vào min(tmp[0], tmp[1])

Nếu mở rộng ra tìm item lớn thứ k thì tạo cái linkedlist có k items (sorted). Mỗi lần tìm thấy cái phù hợp thì insert vào vị trí phù hợp. Nếu thư viện có mấy cái SortedList, SortedArray... thì xài luôn cho tiện.

Sent from Samsung SM-A528B using vozFApp
 
Tạo 1 mảng tmp[] 2 items, duyệt 1 vòng for qua từng item trong mảng chính, thấy item đó lớn hơn tmp[0] hoặc tmp[1] thì gán nó vào min(tmp[0], tmp[1])

Nếu mở rộng ra tìm item lớn thứ k thì tạo cái linkedlist có k items (sorted). Mỗi lần tìm thấy cái phù hợp thì insert vào vị trí phù hợp. Nếu thư viện có mấy cái SortedList, SortedArray... thì xài luôn cho tiện.

Sent from Samsung SM-A528B using vozFApp
K phần tử thì mình thấy dùng maxheap hợp lý hơn, độ phức tạp sẽ bé hơn mấy thằng sorted list
 
K phần tử thì mình thấy dùng maxheap hợp lý hơn, độ phức tạp sẽ bé hơn mấy thằng sorted list

Uh heap với bintree chắc tối ưu hơn, nhưng 2 cái đó tôi không thuộc cách code :( dùng class thư viện là tốt nhất.

Sent from Samsung SM-A528B using vozFApp
 
Trên lớp có bài tập cho 1 mảng, nhập 2 số x, y rồi tìm các số trong mảng nằm trong khoảng x,y. Em làm theo 2 trường hợp x>y và x<y , đứa ngồi cạnh kêu là chỉ cần xét 1 trường hợp thôi mà em nghĩ mãi ko ra nó làm kiểu gì, các bác chỉ e với
 
Array

(

[319] => Array

(

[id] => 0

[parent_id] => 0

[value] => 10

)



[320] => Array

(

[id] => 320

[parent_id] => 0
[value] => 20
)



[321] => Array

(

[id] => 321

[parent_id] => 320
[value] => 15
)



[322] => Array

(

[id] => 322

[parent_id] => 321
[value] => 25

)



[323] => Array

(

[id] => 323

[parent_id] => 0
[value] => 33

)



[324] => Array

(

[id] => 324

[parent_id] => 323
[value] => 20
)



[325] => Array

(

[id] => 325
[parent_id] => 320
[value] => 25

)

)

xưa đi pv cty đưa bài với mảng như trên, yêu cầu là tạo ra mảng lồng nhau từ mảng trên
và tính tổng các value con và cha, kết quả như thê này

Array
(
[319] => Array
(
[id] => 319
[parent_id] => 0
[value] => 10
)

[320] => Array
(
[id] => 320
[parent_id] => 0
[value] => 80
[children] => Array
(
[321] => Array
(
[id] => 321
[parent_id] => 320
[value] => 35
[children] => Array
(
[322] => Array
(
[id] => 322
[parent_id] => 321
)
)
)
[325] => Array
(
[id] => 325
[parent_id] => 320
[value] => 25
)
)
[323] => Array
(
[id] => 323
[parent_id] => 0
[value] => 53
[children] => Array
(
[324] => Array
(
[id] => 324
[parent_id] => 323
[value] => 20
)
)
)

em dùng đệ quy thế là tạch,
 
mọi người cho mình hỏi câu tìm phần tử lớn nhất với lớn thứ 2 trong mảng thì có cách nào tối ưu và có độ phức tạp bé nhất nhỉ
[ 2 4 5 6 6 6 7 7 8 9 8 ]
thằng bé thứ nhì là những thằng đá thua thằng lớn nhứt. Lấy những đội đá thua thằng lớn nhứt ra rồi tìm thằng lớn nhứt trong những đội đó là ra tối ưu nhứt. Ví dụ 32 đội đá đối đầu thì có 5 vòng, thằng chiến thắng chỉ đá 5 chận, tìm được 5 đội đá thua nó thoy. Tìm thằng lớn nhứt trong 5 đội này là ra thằng lớn nhì. Tổng số trận đấu sẽ là 32-1 + 5-1, nếu 32 là n thì tổng số lần so sánh là n + log2(n) - 2. Làm 2 biến thì tệ nhứt là 2n - 3 lần so sánh, về lý thuyết thì cùi hơn (2n-3 > n+logn-2) nhưng thực tế thì có lẽ lẹ hơn
4YMgKo2.gif


ví dụ 16 đội đá nốc ao WC 15 trận thế lày cũng là số trận tối ưu để tìm nhà vô địch, vì mỗi lần so sánh hay mỗi lần đá là loại được 1 đội, 16 đội muốn tìm người chiến thắng nghĩa là loại 15 đội thì phải đá tối thiểu 15 chận. WC 2018 lày thì Fap vô địch, và theo FIFA thì Croatia hạng nhì, nhưng đội hạng nhì phải là 1 trong 4 đội Argentina Uruguay Bỉ Croatia mới đúng. Ko thể là mấy đội còn lại được vì mấy đội còn lại theo tính chất gì đó sẽ thua nhiều hơn 1 đội, ko thể là đội mạnh nhì. Ở đây quy định bóng lá có tính chất bắc cầu, A đá thua B, B đá thua C thì A sẽ đá thua C (trong thực tế bóng lá đéo có tính chất này). Ví dụ Brazil thua Bỉ, Bỉ thua Fap, nên Brazil sẽ thua ít nhất là 2 đội Bỉ và Fap, nên Brazil ko thể mạnh nhì. Chỉ có Argentina, Uruguay, Bỉ, hoặc Croatia chỉ thua 1 đội là Fap thì mới có thể là đội mạnh nhì.
1648559244126.png

về lý thuyết thì sau khi đá 15 chận sẽ tìm ra được 4 đội thua đội mạnh nhứt, nên tìm đội mạnh nhì chỉ cần tìm trong 4 đội này hay chỉ cần đá 3 chận nữa là đủ, ko cần tìm trong 15 đội còn lại. Mở rộng ra nếu n = 1024 thì chỉ cần tìm trong 10 phần tử < phần tử lớn nhứt khi đá loại nốc ao kiểu này. logn < n - 1 rất nhiều khi n lớn. Nếu n ko phải là 2^k thì có thể đắp thêm phần tử rỗng tới khi nào n = 2^k là so sánh kiểu lày được. Tuy nhiên quá chình bookeeping dữ liệu thằng lào thua thằng nào thì cũng ngốn khá nhiều thời gian nên thực tế cứ 2n - 3 mà so sánh tìm thằng lớn nhì
WawmAwM.png
 
Sửa lần cuối:
Các bác cho e hỏi trc khi học thuật toán thì học gì trước ạ? Nhai được cái này cần phải giỏi toán ko? E mất gốc toán cmnr, h đi làm toàn if else loop thôi :(
 
mọi người cho mình hỏi câu tìm phần tử lớn nhất với lớn thứ 2 trong mảng thì có cách nào tối ưu và có độ phức tạp bé nhất nhỉ
[ 2 4 5 6 6 6 7 7 8 9 8 ]
Mình nghĩ 2 cách :
  • Cách 1 : Dùng sort giảm dần rồi lấy ra 2 phần tử đầu tiên khác nhau -> best : O(n), worst : O(nlogn)
  • Cách 2 : Như thím trên tạo 2 biến maxFirst, maxSecond rồi dùng 1 for -> O(n)
Golang :v func find(nums []int) (int, int) { maxFirst, maxSecond := -100000, -100000 for _, value := range nums { if maxFirst <= value { maxSecond = maxFirst maxFirst = value continue } if maxSecond <= value { maxSecond = value } } return maxFirst, maxSecond }
 
Sửa lần cuối:
Không biết bài này có tính vào thuật toán không nhưng em thấy cũng khá liên quan:
Xét trò chơi đoán số giữa 2 người Alice và Bob, mục tiêu của Alice là đoán 1 số trong khoảng từ 1 đến n mà Bob là người nắm giữ, mục tiêu của Bob là buộc Alice phải đoán trong nhiều lần nhất. Ở mỗi lượt chơi, Alice có thể đưa ra dự đoán 1 số X và gửi tới Bob, Bob phải trả lời số X đó lớn hơn hay nhỏ hơn so với mục tiêu. Tuy nhiên, ở một số hữu hạn C lượt, Bob có thể nói dối, a.k.a đưa cho Alice thông tin sai.

Tìm thuật toán mà Alice có thể sử dụng để tìm được số mong muốn. Số ít nhất lượt gửi dự đoán của Alice là bao nhiêu? (trong trường hợp C=0, Alice sử dụng binary search và có thể kết thúc sau O(log n) lượt dự đoán)
 
Không biết bài này có tính vào thuật toán không nhưng em thấy cũng khá liên quan:
Xét trò chơi đoán số giữa 2 người Alice và Bob, mục tiêu của Alice là đoán 1 số trong khoảng từ 1 đến n mà Bob là người nắm giữ, mục tiêu của Bob là buộc Alice phải đoán trong nhiều lần nhất. Ở mỗi lượt chơi, Alice có thể đưa ra dự đoán 1 số X và gửi tới Bob, Bob phải trả lời số X đó lớn hơn hay nhỏ hơn so với mục tiêu. Tuy nhiên, ở một số hữu hạn C lượt, Bob có thể nói dối, a.k.a đưa cho Alice thông tin sai.

Tìm thuật toán mà Alice có thể sử dụng để tìm được số mong muốn. Số ít nhất lượt gửi dự đoán của Alice là bao nhiêu? (trong trường hợp C=0, Alice sử dụng binary search và có thể kết thúc sau O(log n) lượt dự đoán)
chắc là O((C+1)logn) gì thoy, mỗi lần hỏi hỏi lại cùng số đó C+1 lần
vn3lEEe.gif
nếu C+1 lần đều trùng câu trả lời thì đó là nói thật
cgE9MkI.gif
nếu xiaolin thì sẽ có 2 loại trả lời, từ đó hỏi số khác cũng C+1 lần là số cũ +-1 chẳng hạn
cgE9MkI.gif


à nếu biết nó xiaolin` thì hỏi tiếp số đó C+1 lần nữa rồi đếm câu trả lời nào nhiều hơn C lần thì đó là câu trả lời thật. Vậy tối đa O(2(C+1)logn), bỏ số 2 còn O((C+1)logn)
JEWoIdl.png


đúng hơn hỏi thẳng mẹ nó 2C+1 lần mỗi số, nó xiaolin` tối đa C lần tức là ko bao giờ quá bán, đếm câu trả lời nào nhiều hơn thì đó là câu trả lời thật. O((2C+1)logn)
GYA3x5J.gif
 
Sửa lần cuối:
Trên lớp có bài tập cho 1 mảng, nhập 2 số x, y rồi tìm các số trong mảng nằm trong khoảng x,y. Em làm theo 2 trường hợp x>y và x<y , đứa ngồi cạnh kêu là chỉ cần xét 1 trường hợp thôi mà em nghĩ mãi ko ra nó làm kiểu gì, các bác chỉ e với
So sánh x,y trước
 
Xin phép cho e hỏi môn distributed computing mà khó nghĩ quá

Bình thường trong RAM lưu dữ liệu tạm và HDH thường xuyên push vào ổ cứng để lưu trữ vĩnh viễn (lúc m save hoặc sau khoảng x thời gian). Vậy thì cái thông tin trên HDD là vĩnh cửu và là thông tin đúng nhất. Nếu có process nào muốn access cái file đó thì phải lấy trên HDD Cho update.

TH tương tự nhưng trong điều kiện quản lý database, giả sử m có 1 trang đấu giá như ebay đi, server đặt ở VN, nếu có người dùng thì mỗi lần bid hay mua bán gì thì thông tin phải gom thành 1 transaction ghi trên database, vậy dữ liệu trên database là vĩnh cửu và là đúng nhất. Nếu có update gì thì phải check lại với database. Như vậy giả sử có 1 khách ở USA dùng, thì sẽ bị lag/delay trong sử dụng còn khách VN thì ko. Giả sử thông tin gửi qua HTTP delay 300ms

Giả sử 2 khách bid chung 1 món đồ (món đồ đó coi là shared data), Có cách nào để lắp thêm server và clone database ở Mĩ để giải quyết vấn đề lag và delay cho thằng ở USA ko ạ? Nếu làm vậy thì làm sao để sync dữ liệu 2 cái database cách nhau cỡ 300ms? Dữ liệu nào mới là dữ liệu đúng nhất khi cả 2 cũng bid cách nhau 100ms

EDIT, t tÌm đc câu trả lời rồi. nó là "active/active distributed databases" ví dụ như Apache Cassandra. Nếu 2 người cùng access 1 dữ liệu thì ai hit trước người đó write, request của ai đến sau thì xếp hàng có timeout, đến lượt thì check valid. Tóm lại là ai xa database hơn thì sẽ tốn thời quan đến nên phải xếp hàng, có khả năng bị reject. Đây cũng là lý do vì sao các công ty trading đặt trụ sở và thuê host gần DB của sàn chứng khoán
 
Sửa lần cuối:

Thống kê chủ đề

Ngày tạo
unknowpc90,
Người trả lời cuối
Spaghetti Code,
Trả lời
1.460
Lượt xem
154.040
Quay lại
Lên đầu trang