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
Oh dĩ nhiên nhanh hơn thì phải tốn mem hơn rồi. Mà thường thì người ta chú trọng thời gian hơn memo.

Sent from Samsung SM-A528B using vozFApp
nó nhanh hơn lúc search thôi, còn lúc build cái trie thì lại chậm hơn rất rất nhiều. VD 1 chuỗi có length là 1000 thì nó phải insert 1000 lần chuỗi có độ dài từ 1002 đến 2001. Trong khi cách dùng 2 trie chỉ cần insert duy nhất 2 lần: chuỗi ban đầu và đảo ngược của nó.

Nên nếu nói cách https://www.geeksforgeeks.org/searc...with-a-given-prefix-and-suffix-for-q-queries/ luôn luôn nhanh hơn là chưa chắc đúng đâu fen. Chuỗi s mà dài quá là vỡ mồm ngay. :D
 
liệt kê tất cả số có 3 chữ số tạo bởi 2 số a hoặc b hoặc cả 2 trong ma trận
nếu giải tay thì ta biết dc có 2^3=8 số thỏa mãn,aaa,aab,aba,......,bbb
ví dụ
input:1,2
output:
[
[1, 1, 1]
[1, 1, 2]
[1, 2, 1]
.....
.....
.....
[2, 2, 2]
]
giúp em với:adore:
Bài này bác dùng backtracking là ra :D
 
liệt kê tất cả số có 3 chữ số tạo bởi 2 số a hoặc b hoặc cả 2 trong ma trận
nếu giải tay thì ta biết dc có 2^3=8 số thỏa mãn,aaa,aab,aba,......,bbb
ví dụ
input:1,2
output:
[
[1, 1, 1]
[1, 1, 2]
[1, 2, 1]
.....
.....
.....
[2, 2, 2]
]
giúp em với:adore:
Python:
def func(a, b):
    ret = [[]]
    for i in range(0,3):
        ret = [[a] + x for x in ret] + [[b] + x for x in ret]
    return ret
   
print(func(1,2))
đây nhé,:big_smile:
 
liệt kê tất cả số có 3 chữ số tạo bởi 2 số a hoặc b hoặc cả 2 trong ma trận
nếu giải tay thì ta biết dc có 2^3=8 số thỏa mãn,aaa,aab,aba,......,bbb
ví dụ
input:1,2
output:
[
[1, 1, 1]
[1, 1, 2]
[1, 2, 1]
.....
.....
.....
[2, 2, 2]
]
giúp em với:adore:
a, b có ràng buộc từ 0 - 9 không thế?
Nếu 0 - 9 thì liệt kê 8 cái mảng, nhớ check phần tử đầu của 8 mảng khác 0, chỉ trả về mảng nào phần tử đầu khác 0:cautious:
 
liệt kê tất cả số có 3 chữ số tạo bởi 2 số a hoặc b hoặc cả 2 trong ma trận
nếu giải tay thì ta biết dc có 2^3=8 số thỏa mãn,aaa,aab,aba,......,bbb
ví dụ
input:1,2
output:
[
[1, 1, 1]
[1, 1, 2]
[1, 2, 1]
.....
.....
.....
[2, 2, 2]
]
giúp em với:adore:
Dùng BFS cho nó dễ hình dung, backtrack đau đầu lắm
C++:
queue<string>q;
        q.push("1");
        q.push("2");
        vector<string>res;
        while(!q.empty()){
            string z=q.front();
            q.pop();
            if(z.size()==3){
                res.push_back(z);
                continue;
            }
            q.push(z+"1");
            q.push(z+"2");
        }
        for(auto x:res) cout<<x<<" ";
 
bài này dạng in ra tất cả các số nhị phân có n chữ số, có thể dùng thuật toán sinh cũng được
OG0lsXv.png
 
Hồi ở trường không được học thuật toán nên không có căn bản, bay vô leet code tập làm có được k mấy thím. Hay phải học có bản mới được :beat_brick:

Gửi từ Samsung SM-G996B bằng vozFApp
 
liệt kê tất cả số có 3 chữ số tạo bởi 2 số a hoặc b hoặc cả 2 trong ma trận
nếu giải tay thì ta biết dc có 2^3=8 số thỏa mãn,aaa,aab,aba,......,bbb
ví dụ
input:1,2
output:
[
[1, 1, 1]
[1, 1, 2]
[1, 2, 1]
.....
.....
.....
[2, 2, 2]
]
giúp em với:adore:

Bài này giống đố mẹo hoặc là mới nhập môn vậy?. Biết trước có 8 cách rồi thì tạo cái mảng 2 chiều với 2 biến a, b sẵn rồi print ra là đc, loop với đệ quy làm gì cho mệt. Khi nào 2 cái số 2 và 3 nó thành n và m thì mới cần giải.
 
Thuật toán Floyde Bellman cơ bản thôi. Không nhớ viết đúng ko. Hoặc tra trên vnoi các thuật toán đường đi ngắn nhất là ra
ý bác là tìm đường đi ngắn nhất rồi chọn min đúng kh ạ, có thuật nào tối ưu hơn không ạ
 
ý bác là tìm đường đi ngắn nhất rồi chọn min đúng kh ạ, có thuật nào tối ưu hơn không ạ
Mỗi lần tìm xong đường đi ngắn nhất từ 1 đỉnh v tới đích t thì bác lưu tất cả các đỉnh trên đường đi từ v tới t (kèm khoảng cách) lại.

Sau đó ko cần xét lại các đỉnh đã lưu nữa hoặc sử dụng đỉnh đã cache từ trước để tính toán cho đỉnh mới thay vì đi lại.

Sửa Dijkstra lại 1 chút là được
 
Mỗi lần tìm xong đường đi ngắn nhất từ 1 đỉnh v tới đích t thì bác lưu tất cả các đỉnh trên đường đi từ v tới t (kèm khoảng cách) lại.

Sau đó ko cần xét lại các đỉnh đã lưu nữa hoặc sử dụng đỉnh đã cache từ trước để tính toán cho đỉnh mới thay vì đi lại.

Sửa Dijkstra lại 1 chút là được
K cần đâu làm vậy đâu, suy nghĩ ngược lại thay vì tìm đường đi ngắn nhất từ tất cả các đỉnh đến t thì từ t đi ngược lại 3 đỉnh bằng djstra ấy. 3 đỉnh reachable đầu tiên là 3 đỉnh có đường đi ngắn nhất đến t.
 
K cần đâu làm vậy đâu, suy nghĩ ngược lại thay vì tìm đường đi ngắn nhất từ tất cả các đỉnh đến t thì từ t đi ngược lại 3 đỉnh bằng djstra ấy. 3 đỉnh reachable đầu tiên là 3 đỉnh có đường đi ngắn nhất đến t.

Không được đâu, vì theo đề bài thì đồ thị là có hướng, đường đi ở hai chiều không nhất thiết tương đương.

--
Edited: Nếu dùng với đồ thị ngược của input thì có khi được.

Vậy thuật toán sẽ là như này:

  • B1: đặt E' = <đảo chiều các cạnh của E>
  • B2: Chạy Dijkstra (V, E') với bắt đầu là t. Dừng khi tìm được đường đi ngắn nhất đến tất cả N điểm nguồn,
  • B3: Output 3 đường đi ngắn nhất trong số N
 
Sửa lần cuối:
K cần đâu làm vậy đâu, suy nghĩ ngược lại thay vì tìm đường đi ngắn nhất từ tất cả các đỉnh đến t thì từ t đi ngược lại 3 đỉnh bằng djstra ấy. 3 đỉnh reachable đầu tiên là 3 đỉnh có đường đi ngắn nhất đến t.
reachable đầu tiên chưa chắc là ngắn nhất bác, đỉnh nào phải là được chọn để đi tiếp mới là ngắn nhất chứ ạ
 
Không được đâu, vì theo đề bài thì đồ thị là có hướng, đường đi ở hai chiều không nhất thiết tương đương.

--
Edited: Nếu dùng với đồ thị ngược của input thì có khi được.

Vậy thuật toán sẽ là như này:

  • B1: đặt E' = <đảo chiều các cạnh của E>
  • B2: Chạy Dijkstra (V, E') với bắt đầu là t. Dừng khi tìm được đường đi ngắn nhất đến tất cả N điểm nguồn,
  • B3: Output 3 đường đi ngắn nhất trong số N
tức là vẫn phải tìm từ t đến N đỉnh kia xong chọn 3 thằng min đúng k ạ, quan trọng phải đảo chiều đồ thị ban đầu
 
K cần đâu làm vậy đâu, suy nghĩ ngược lại thay vì tìm đường đi ngắn nhất từ tất cả các đỉnh đến t thì từ t đi ngược lại 3 đỉnh bằng djstra ấy. 3 đỉnh reachable đầu tiên là 3 đỉnh có đường đi ngắn nhất đến t.
Thanks thím. Như vậy vừa trong khi dijsktra từ t thì reverse hướng dần dần nhỉ. Cho đến khi số đỉnh đã tìm shortest path finish == 3 dừng là đc
 

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.039
Quay lại
Lên đầu trang