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
Không khác gì hết. Vậy nên hãy dùng protected nếu muốn inherit và sử dụng biến của class cha cho class con :go:
vậy thì tại sao nói là lớp con kế thừa hết các dữ liệu private ở lớp cha ạ? có ví dụ nào cho thấy lớp con kế thừa hết các dữ liệu này không thím? còn nếu kế thừa hết mà không khác gì các class khác vẫn phải thông qua getter thì em không biết là khác gì vs không kế thừa?
 
vậy thì tại sao nói là lớp con kế thừa hết các dữ liệu private ở lớp cha ạ? có ví dụ nào cho thấy lớp con kế thừa hết các dữ liệu này không thím? còn nếu kế thừa hết mà không khác gì các class khác vẫn phải thông qua getter thì em không biết là khác gì vs không kế thừa?
gọi sizeof(lớp con) là thấy size của lớp con có bao gồm dữ liệu lớp cha thoy
MjfezZB.png


vd lớp cha có 1 int 1 float thì size của nó là 4+4 = 8 [][][][][][][][]
lớp con kế thừa lớp cha, lớp con có thêm 1 double nữa là 8 (size của lớp cha) + 8 byte của double thành size 16 [][][][][][][][][][][][][][][][]
 
vậy thì tại sao nói là lớp con kế thừa hết các dữ liệu private ở lớp cha ạ? có ví dụ nào cho thấy lớp con kế thừa hết các dữ liệu này không thím? còn nếu kế thừa hết mà không khác gì các class khác vẫn phải thông qua getter thì em không biết là khác gì vs không kế thừa?
Ví dụ đây:
C++:
class A {
public:
    int a1 = 1;
private:
    int a2 = 2;
};

class B : public A{
public:
    int b1 = 3;
private:
    int b2 = 4;
};

int main() {
    
    A a;
    B b;
}

Truy cập vào memory của a, sẽ thấy 2 biến có giá trị 1 (public) và 2(private)
1655278911348.png

Truy cập vào memory của b, sẽ thấy 4 biến có giá trị 1, 2, 3, 4 (bao gồm 1 và 2 từ class cha), nhưng ko access đc giá trị 2 do private
1655279022057.png


Lúc đấy chỉ có mò địa chỉ offset để lấy ra đc thôi

C++:
    B* bb = &b;

    cout << *(int*)(&bb->a1 + 1) << endl;
 
Ví dụ đây:
C++:
class A {
public:
    int a1 = 1;
private:
    int a2 = 2;
};

class B : public A{
public:
    int b1 = 3;
private:
    int b2 = 4;
};

int main() {
   
    A a;
    B b;
}

Truy cập vào memory của a, sẽ thấy 2 biến có giá trị 1 (public) và 2(private)
Xem tệp đính kèm 1212535
Truy cập vào memory của b, sẽ thấy 4 biến có giá trị 1, 2, 3, 4 (bao gồm 1 và 2 từ class cha), nhưng ko access đc giá trị 2 do private
Xem tệp đính kèm 1212536

Lúc đấy chỉ có mò địa chỉ offset để lấy ra đc thôi

C++:
    B* bb = &b;

    cout << *(int*)(&bb->a1 + 1) << endl;
thanks thím :vvv
b84UnA6.png
b84UnA6.png
 
https://binarysearch.com
Ở đây có thím nào thử trang này chưa?
Bổn tọa thử ròi, leetcode all the way nhé:ROFLMAO:

Cùng 1 bài, binarysearch id 137, leetcode 1344, leetcode bổn tọa pass còn binarysearch thì không(tất nhiên code giữ nguyên):rolleyes:

Tuy cùng 1 bài nhưng cách đưa các test case thì 2 oj này khác nhau, search 2 bài trên ròi sẽ rõ.:whistle:

Cái mạnh nhất giúp lên trình là mục discuss, binarysearch lèo tèo 2 3 cái, mà code như cc ý:rolleyes:
 
Bài leetcode sáng nay kinh vl. Giải mãi mới ra :( Vô pv gặp bài này chắc đắp chiếu quá :(

Nay có việc chưa làm được, mới đọc sơ thì ý tưởng là lưu cả string và reverse string vào cây 26-phân.

Để tối về code xem sao.

Sent from Samsung SM-A528B using vozFApp
 
Nay có việc chưa làm được, mới đọc sơ thì ý tưởng là lưu cả string và reverse string vào cây 26-phân.

Để tối về code xem sao.

Sent from Samsung SM-A528B using vozFApp
Dùng 2 cái Trie, 1 cái lưu xuôi, 1 cái lưu ngược. Sau khi search theo prefix với suffix thì sẽ ra 2 cái set. Kể quả là max value của intersection của 2 cái set đó. Chỗ này xử lý tinh tế 1 xíu thì sẽ k bị TLE.
 
Dùng 2 cái Trie, 1 cái lưu xuôi, 1 cái lưu ngược. Sau khi search theo prefix với suffix thì sẽ ra 2 cái set. Kể quả là max value của intersection của 2 cái set đó. Chỗ này xử lý tinh tế 1 xíu thì sẽ k bị TLE.

Tôi cũng mới làm xong, search ra có cách này tối ưu hơn nè, chỉ cần dùng 1 trie thôi https://www.geeksforgeeks.org/searc...with-a-given-prefix-and-suffix-for-q-queries/

Sent from Samsung SM-A528B using vozFApp
 
chẳng cần nghĩ, brute force cũng qua lol. Hash phần wordfilter, truy vấn f thì binary search, mỗi tội chạy chậm vc, hơn được 20%. Kể mà đi phỏng vấn cũng như làm contest, thằng nào code xong trước auto ăn thì ngon, mấy bài như này vài phút là xong
C++:
struct cmp {
  bool operator()(const pair<string,int>&a,const pair<string,int>& b) const {
     return (a.first==b.first?a.second>b.second:a.first<b.first);
  }
};
class WordFilter {
public:
    unordered_map<string,set<pair<string,int>,cmp>>m;
    map<string,int>q;
    WordFilter(vector<string>& words) {
        int n=words.size();
        for(int i=0;i<n;i++){
            q[words[i]]=i;
        }
        for(auto x:q){
            string z=x.first;
            string u="";
            for(int j=0;j<z.length();j++){
                u+=z[j];
                string h="";
                for(int k=z.length()-1;k>=0;k--){
                    h+=z[k];
                    string p=h;
                    reverse(p.begin(),p.end());
                    m[u].insert({p,x.second});
                }
            }
        }
    }
    int f(string prefix, string suffix) {
        if(m[prefix].lower_bound({suffix,15001})!=m[prefix].end()){
            pair<string,int>it=*m[prefix].lower_bound({suffix,15001});
            if(suffix==it.first) return it.second;
        }
        return -1;
    }
};

/**
 * Your WordFilter object will be instantiated and called as such:
 * WordFilter* obj = new WordFilter(words);
 * int param_1 = obj->f(prefix,suffix);
 */
 
Tôi cũng mới làm xong, search ra có cách này tối ưu hơn nè, chỉ cần dùng 1 trie thôi https://www.geeksforgeeks.org/searc...with-a-given-prefix-and-suffix-for-q-queries/

Sent from Samsung SM-A528B using vozFApp
cách này k hẳn là tối ưu hơn đâu. Đồng ý là nó search nhanh hơn dùng 2 trie rồi intersect. Nhưng nó tốn mem hơn, và lúc build cái trie cũng lâu hơn nữa.
Vd từ word = "apple"
cách 1: lưu "apple" vào prefixTrie, lưu "elppa" vào suffixTrie.
cách 2: lưu e{apple, le{apple, ple{apple, pple{apple, apple{apple vào trie.
Nhìn qua là thấy cách 2 tốn mem và build trie lâu hơn rồi.
=> cách 1 phù hợp với trường hợp số lượng word nhiều, word dài
=> cách 2 phù hợp với trường hợp số lượng word ít, word ngắn, số lượng search query lớn.
 
cách này k hẳn là tối ưu hơn đâu. Đồng ý là nó search nhanh hơn dùng 2 trie rồi intersect. Nhưng nó tốn mem hơn, và lúc build cái trie cũng lâu hơn nữa.
Vd từ word = "apple"
cách 1: lưu "apple" vào prefixTrie, lưu "elppa" vào suffixTrie.
cách 2: lưu e{apple, le{apple, ple{apple, pple{apple, apple{apple vào trie.
Nhìn qua là thấy cách 2 tốn mem và build trie lâu hơn rồi.
=> cách 1 phù hợp với trường hợp số lượng word nhiều, word dài
=> cách 2 phù hợp với trường hợp số lượng word ít, word ngắn, số lượng search query lớn.

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
 

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