thắc mắc [Học tập] Toán Rời Rạc trong cuộc đời lập trình viên

TLB là để cache lại quá trình translate từ địa chỉ ảo sang địa chỉ vật lý, còn giá trị tại các ô nhớ thì là ở CPU Cache (L1/L2/L3).

Về cơ bản một cài đặt tree kiểu bình thường là như này: allocate một node X tại địa chỉ A, rồi allocate node Y tại địa chỉ B,... Vì các phép allocate là riêng biệt tách rời nhau nên tùy vào thuật toán cụ thể mà A với B có thể có giá trị cách xa nhau trong không gian bộ nhớ.
Trong trường hợp đó, khi truy cập node X, cpu sẽ prefetch bộ nhớ tại địa chỉ A và các địa chỉ lân cận vào cache. Nếu cache mà hết thì sẽ phải xoá (evict) bớt những mục cũ đưa xuống cache level thấp hơn, từ L1 xuống L2, L2 xuống L3, nếu bị xoá khỏi L3 thì tức không còn trong cache.
Sau đó, đến lúc truy cập vào Y tại địa chỉ B, vì A B cách xa nhau nên nhiều khả năng là B sẽ không tìm thấy trong cache, hoặc chỉ có ở cache level thấp. Khi đó CPU lại phải load lại giá trị của ô nhớ B từ RAM vào.
Vì thế cho nên mới nói tree thường dùng cache không hiệu quả. Với array thì khác, các element của nó được lưu ở các địa chỉ liên tục, lại kích thước nhỏ (không phải lưu địa chỉ của node khác trong array) nên khi truy cập tuần tự khả năng một node đã có trong cache là rất cao.
Tất nhiên vẫn có cách tối ưu hóa tree, nếu biết được access pattern của các node trong tree thì có thể viết custom allocator để sao cho các node thường được truy cập liên tiếp ở gần nhau trong bộ nhớ.

150 - 200 CPU cycle là latency của phép truy cập bộ nhớ RAM từ CPU. Giả sử CPU 4 GHz thì thời gian tuyệt đối là 50 ns. Con số này khoảng mấy chục năm nay chưa được cải thiện mấy.

Đoạn trên mình đã bỏ qua phần địa chỉ ảo - địa chỉ vật lý để cho đơn giản, đem vào thì vấn đề còn phức tạp hơn. Vì thực tế memory được chia thành từng page kích thước chuẩn là 4KB, nếu địa chỉ nằm trong cùng một page ảo thì nó sẽ mới thực sự gần nhau về mặt vật lý. Nhưng nếu thuộc 2 page khác nhau thì không, khi vượt qua page boundary thì vẫn phải fetch lại từ RAM như thường, và có thể còn tốn hơn vì có thể lúc đó TLB cache cũng bị miss. Cho nên hiện nay có khái niệm Huge Pages, tức là page kích thước lớn, khoảng 2MB hoặc 1GB, nhiều ứng dụng nhất là database cho phép cấu hình sử dụng hugepage để tự mình nó quản lý bộ nhớ, giảm vấn đề như trên.

Sent from Xiaomi Redmi 5A using vozFApp
Bác cho em hỏi vài câu nữa được không ạ, không biết có làm phiền bác quá k ạ :D
Tại sao Array lại tốt hơn Linked-List trong việc tận dụng cache ạ? Vì theo em nhớ là LL thì link đến nhau, tận dụng các khoảng trống giữa các memory block tốt hơn Dynamic Array (Theo em biết thì phần lớn ngôn ngữ hiện đại sử dụng chiến thuật amortization khi allocate vùng nhớ cho array).
Có lí do nào khác ngoài Array chỉ lưu giá trị so với LL phải lưu thêm pointer không ạ :D
Số lượng data block (vị trí KHÔNG liên tục) có thể fetch tối đa 1 lần từ Ram => Cache là bao nhiêu ạ ? Theo như em đọc thì thời gian tối thiểu để RAM phản hồi lại CPU = Cas latency + Thời gian tìm kiếm block data (tRCD+tRP), tuy nhiên em không rõ trong controller của Ram liệu có cơ chế như multi thread không, để nhiều lệnh tìm kiếm từ multi thread trên CPU để seeking đồng thời như HDD, hay nó chỉ tìm được data block theo tuần tự.

Standard
name
Memory
clock
(MHz)
I/O bus
clock
(MHz)
Data
rate
(MT/s)
Module
name
Peak trans-
fer rate
(MB/s)
Timings
CL-tRCD-tRP
CAS
latency
(ns)
DDR4-3200W
DDR4-3200AA
DDR4-3200AC
40016003200PC4-256002560020-20-20
22-22-22
24-24-24
12.5
13.75
15

Với lại cấu trúc Tree có tận dụng tốt multicore/multithread không ạ? Giả sử 1 tree có các node X=>Y=>Z thì em nghĩ khi Core 1 truy cập node 1, thì các core/thread còn lại có thể predicate để gửi lệnh fetch luôn data của Y và Z từ RAM lên cache L3 luôn thay vì chờ, điều này có đúng k ạ ? :D
 
Về memory, cache thì có bài viết kinh điển này dân dev nên đọc: What Every Programmer Should Know About Memory (pdf): https://people.freebsd.org/~lstewart/articles/cpumemory.pdf
Tác giả là cựu lead dev của glibc.

Bác cho em hỏi vài câu nữa được không ạ, không biết có làm phiền bác quá k ạ :D
Tại sao Array lại tốt hơn Linked-List trong việc tận dụng cache ạ? Vì theo em nhớ là LL thì link đến nhau, tận dụng các khoảng trống giữa các memory block tốt hơn Dynamic Array (Theo em biết thì phần lớn ngôn ngữ hiện đại sử dụng chiến thuật amortization khi allocate vùng nhớ cho array).
Có lí do nào khác ngoài Array chỉ lưu giá trị so với LL phải lưu thêm pointer không ạ :D
Thì cũng giống như tree vs array thôi. Array là liên tục, LL là rời rạc, liên tục thì xác suất phần tử sẽ truy cập tồn tại trong cache cao hơn (vì đã được prefetch trước đó). Tất nhiên là điều này chỉ đúng khi truy cập tuần tự, ví dụ duyệt array từ đầu đến cuối.

Số lượng data block (vị trí KHÔNG liên tục) có thể fetch tối đa 1 lần từ Ram => Cache là bao nhiêu ạ ? Theo như em đọc thì thời gian tối thiểu để RAM phản hồi lại CPU = Cas latency + Thời gian tìm kiếm block data (tRCD+tRP), tuy nhiên em không rõ trong controller của Ram liệu có cơ chế như multi thread không, để nhiều lệnh tìm kiếm từ multi thread trên CPU để seeking đồng thời như HDD, hay nó chỉ tìm được data block theo tuần tự.

Standard
name
Memory
clock
(MHz)
I/O bus
clock
(MHz)
Data
rate
(MT/s)
Module
name
Peak trans-
fer rate
(MB/s)
Timings
CL-tRCD-tRP
CAS
latency
(ns)
DDR4-3200W
DDR4-3200AA
DDR4-3200AC
40016003200PC4-256002560020-20-20
22-22-22
24-24-24
12.5
13.75
15

Một module RAM chỉ hỗ trọ 1 lần access tại một thời điểm. Vì bản chất của RAM mà việc truy cập bộ nhớ ở vị trí gần nhau sẽ luôn nhanh hơn so với vị trí xa nhau (việc này không liên quan gì đến cache). Vì các ô nhớ trong RAM được đánh số theo Row và Col, để truy cập vào một ô thì đầu tiên phải active Row của nó, sau đó mới đến Column, tức là fetch cả một dải gồm các ô nhớ trong cùng Row sẽ nhanh hơn vì không cần phải active Row nhiều lần.
Mà trong thực tế thì vì cache line kích thước khoảng 64 byte nên mỗi lần truy cập 1 byte bộ nhớ CPU nó cũng sẽ requests cả line 64 byte chứ không chỉ mỗi byte đó.

Quy trình để access RAM từ cache là
  • Deactivate Row cũ, precharge Row mới, tốn tRP
  • Select Row mới, tốn tRAS
  • Delay giữa Row và Column: tRCD
  • Select Column: tCAS
  • Transfer data về CPU cache
Tùy vào access pattern mà thời gian access một bit RAM có thể khác nhau. Nếu tuần tự thì có thể bỏ được ít nhất là 3 bước đầu, nếu ở một Row khác thì rõ là phải làm lại từ đầu.

Nhưng mà RAM ngày nay lại tổ chức theo kiểu phân cấp, cả hệ thống chia thành nhiều channel, một channel có nhiều DIMM, trên 1 DIMM có nhiều module khác nhau nên đúng là có thể thực hiện song song cùng lúc nhiều phép access không tuần tự, miễn là controller đủ thông minh và data bus còn đủ.

Search qua thì thấy Intel controller của nó có thể thực hiện được cùng lúc 32 command: https://stackoverflow.com/questions/45382914/parallel-memory-access-on-modern-processors
 
Bản chất của các loại tree là mỗi node có một danh sách con trỏ, những con trỏ này là trỏ đến một node khác. Địa chỉ bộ nhớ các node không liên tục mà rải rác nên không tận dụng tốt CPU Cache, vì cache có đặc tính Spatial locality, khi load giá trị trong RAM tại một địa chỉ thì nó cũng tự động prefetch một số ô nhớ gần đó để đưa vào cache. Linked list cũng có tính chất tương tự tree, cho nên mới có lời khuyên là nên ưu tiên dùng array, khi không dùng được thì tìm cách convert về array.

Đoạn sau là đang giả sử tình huống tệ nhất, tất các các phép reference đến node con trong trie đều miss cache, phải load lại từ đầu trong RAM ra, một lần như vậy mất khoảng 150 - 200 CPU cycle.


Thím nầy nói chuẩn nầy. Đáng tiếc ko phải ai cũng chịu đọc mấy cái về cache l1 l2 l3 của cpu. Vs độ trễ của các tập lệnh trển các đời cpu.
 
Bác @bribnt cho hỏi là những kiến thức bác nói trong topic này là từ môn học/tài liệu nào thế ạ.

Về cache, memory thì trong môn kiến trúc máy tính có dạy khá kỹ. Quản lý bộ nhớ thuộc về môn hệ điều hành.
Có quyển Computer Architecture: A quantative approach nói về kiến trúc máy tính đi theo hướng định lượng, tức là như khi bàn về cache thì sẽ phân tích xem nên design cache size chừng nào, 4-way hay 8-way, cache line bao nhiêu, ... thì sẽ có hiệu năng tốt hơn hay tiết kiệm năng lượng hơn.

Lập trình tối ưu sử dụng những kiến thức trên kia thì cứ đọc hết tài liệu của Agner Fog: https://agner.org/optimize/
 
1 thầy dạy bên bách khoa sang trường mình dạy. Dùng lý thuyết đồ thị viết câu truy vấn SQL, csdl phân tán + software testing, đỉnh vkl. Ông kể dùng Quine mccluskey rút gọn câu truy vấn + index on, 2 triệu dòng truy vấn trong hơn 1 tiếng còn 10s, ko biết có phải thật ko

Sent from Xiaomi Redmi Note 4 using vozFApp
 
Vẫn có áp dụng. ví dụ như đệ quy, duyệt cây chiều rộng và chiều sâu để giải quyết bài toán hợp cộng chi tiêu....
 
Mình là một người không theo học đại học chính quy, thường hay nghe môn Toán Rời Rạc là một trong những môn đại cương quan trọng nhất của developer
Cho mình xin ý kiến của những người đã đi làm về mức quan trọng của môn này

Và quan trọng là cho mình xin những keyword tài liệu và khóa học có thể giúp nắm vững môn này trong lòng bàn tay (và lòng bàn chân)

Quan trọng, phù thuộc vào định hướng phát triển của bạn

Lời khuyên cá nhân của tôi là đọc/học cảm thấy vào thì tốt. Thấy khó học/khó hiểu hay chán ghét nó thì cũng không nhất thiết phải quá lo lắng.

Tôi tự đánh giá mình ở trình độ so với 1 quyển toán rời rạc đại cương thì hiểu được 2 phần trên 10. Trong 2 phần đó, hiểu đến mức đem áp dụng vào thực tiễn 2 trên 10 nữa. Như thế là tạm đủ cho bản thân tôi

1 Sets and Logic

1.1 Sets

1.2 Propositions

1.3 Conditional Propositions and Logical Equivalence

1.4 Arguments and Rules of Inference

1.5 Quantifiers

1.6 Nested Quantifiers

Problem-Solving Corner: Quantifiers



2 Proofs

2.1 Mathematical Systems, Direct Proofs, and Counterexamples

2.2 More Methods of Proof

Problem-Solving Corner: Proving Some Properties of Real Numbers

2.3 Resolution Proofs

2.4 Mathematical Induction

Problem-Solving Corner: Mathematical Induction

2.5 Strong Form of Induction and the Well-Ordering Property Notes Chapter Review Chapter Self-Test Computer Exercises



3 Functions, Sequences, and Relations

3.1 Functions

Problem-Solving Corner: Functions

3.2 Sequences and Strings

3.3 Relations

3.4 Equivalence Relations

Problem-Solving Corner: Equivalence Relations

3.5 Matrices of Relations

3.6 Relational Databases



4 Algorithms

4.1 Introduction

4.2 Examples of Algorithms

4.3 Analysis of Algorithms

Problem-Solving Corner: Design and Analysis of an Algorithm

4.4 Recursive Algorithms



5 Introduction to Number Theory

5.1 Divisors

5.2 Representations of Integers and Integer Algorithms

5.3 The Euclidean Algorithm

Problem-Solving Corner: Making Postage

5.4 The RSA Public-Key Cryptosystem



6 Counting Methods and the Pigeonhole Principle

6.1 Basic Principles

Problem-Solving Corner: Counting

6.2 Permutations and Combinations

Problem-Solving Corner: Combinations

6.3 Generalized Permutations and Combinations

6.4 Algorithms for Generating Permutations and Combinations

6.5 Introduction to Discrete Probability

6.6 Discrete Probability Theory

6.7 Binomial Coefficients and Combinatorial Identities

6.8 The Pigeonhole Principle



7 Recurrence Relations

7.1 Introduction

7.2 Solving Recurrence Relations

Problem-Solving Corner: Recurrence Relations

7.3 Applications to the Analysis of Algorithms



8 Graph Theory

8.1 Introduction

8.2 Paths and Cycles

Problem-Solving Corner: Graphs

8.3 Hamiltonian Cycles and the Traveling Salesperson Problem

8.4 A Shortest-Path Algorithm

8.5 Representations of Graphs

8.6 Isomorphisms of Graphs

8.7 Planar Graphs

8.8 Instant Insanity



9 Trees

9.1 Introduction

9.2 Terminology and Characterizations of Trees

Problem-Solving Corner: Trees

9.3 Spanning Trees

9.4 Minimal Spanning Trees

9.5 Binary Trees

9.6 Tree Traversals

9.7 Decision Trees and the Minimum Time for Sorting

9.8 Isomorphisms of Trees

9.9 Game Trees



10 Network Models

10.1 Introduction

10.2 A Maximal Flow Algorithm

10.3 The Max Flow, Min Cut Theorem

10.4 Matching

Problem-Solving Corner: Matching



11 Boolean Algebras and Combinatorial Circuits

11.1 Combinatorial Circuits

11.2 Properties of Combinatorial Circuits

11.3 Boolean Algebras

Problem-Solving Corner: Boolean Algebras

11.4 Boolean Functions and Synthesis of Circuits

11.5 Applications



12 Automata, Grammars, and Languages

12.1 Sequential Circuits and Finite-State Machines

12.2 Finite-State Automata

12.3 Languages and Grammars

12.4 Nondeterministic Finite-State Automata

12.5 Relationships Between Languages and Automata



Appendix

A Matrices

B Algebra Review

C Pseudocode

References

Hints and Solutions to Selected Exercises Index

1602956760093.png


Giáo trình trường dạy đây, sách của Pearson
 
Sau vài năm đi làm thực chiến, rảnh rỗi ngồi đọc lại & suy gẫm mấy môn đại cương hồi ĐH như toán rời rạc, lý thuyết đồ thị, cấu trúc giải thuật & dữ liệu, trí tuệ nhân tạo...
Lúc này mới thấy nó hay & vô tình dùng nhiều nhưng trong lúc học chả biết ... Có thể bị bỏ qua do hồi đó nhóm tập trung chương này để làm đồ án mà bỏ qua chương kia của nhóm khác.
 
Quan trọng, phù thuộc vào định hướng phát triển của bạn

Lời khuyên cá nhân của tôi là đọc/học cảm thấy vào thì tốt. Thấy khó học/khó hiểu hay chán ghét nó thì cũng không nhất thiết phải quá lo lắng.

Tôi tự đánh giá mình ở trình độ so với 1 quyển toán rời rạc đại cương thì hiểu được 2 phần trên 10. Trong 2 phần đó, hiểu đến mức đem áp dụng vào thực tiễn 2 trên 10 nữa. Như thế là tạm đủ cho bản thân tôi



View attachment 244252

Giáo trình trường dạy đây, sách của Pearson
cảm ơn bác
Trường bác dạy giáo trình nước ngoài à, bác học trường gì
 
Hên quá mình code mobile toàn gọi Api nên k dính cái này. Chắc làm thợ code thôi

via theNEXTvoz for iPhone
code mobile thì chịu khó xài cái này nhiều vô, tôi dùng cây nhị phân để lưu trữ dự liệu nè, rồi viết ra thành 1 lib, mấy app mobile hay game thì cứ gắn lib vô bao xài, gọi thông tin ra nhanh hơn dùng sql hay json lưu trữ
ra ngoài đi làm thì tôi dùng khá nhiều lý thuyết của toán rời rạc để áp vào code và mind set, chứ gọi API ra để chạy thì perf kém lắm, chưa kể tính linh hoạt của ứng dụng hay thư viện để nâng cấp và dùng cho các dự án sau nữa
 
code mobile thì chịu khó xài cái này nhiều vô, tôi dùng cây nhị phân để lưu trữ dự liệu nè, rồi viết ra thành 1 lib, mấy app mobile hay game thì cứ gắn lib vô bao xài, gọi thông tin ra nhanh hơn dùng sql hay json lưu trữ
ra ngoài đi làm thì tôi dùng khá nhiều lý thuyết của toán rời rạc để áp vào code và mind set, chứ gọi API ra để chạy thì perf kém lắm, chưa kể tính linh hoạt của ứng dụng hay thư viện để nâng cấp và dùng cho các dự án sau nữa
Xàm quá cha nội

via theNEXTvoz for iPhone
 
Để tôi kể cho các bạn trường hợp cái app dưới sign tôi đang làm xem nó có cần học thuật toán hay không.

Nói đến cái webapp của tôi, thì nó là một cái công cụ dịch máy tiếng tàu. Nghe dịch máy thì rõ oai, nhưng về bản chất là thay thế 1:1 từ tiếng trung sang tiếng việt, ví dụ 程序员=>lập trình viên hay 码农=>code monkey... cho nên cái quan trọng nhất là dữ liệu từ điển đúng đắn đầy đủ, chứ không là thuật toán thông minh.

ví dụ kết quả cụ thể cho các bạn tham khảo: https://chivi.xyz/~dai-phung-da-canh-nhan/chuong-162-lau-nam-ban-an-cu-xbiquge-36253791

chuyện nó chẳng có gì, nếu như không nói đến việc dữ liệu từ điển nó nằm tầm 500k tới 1 triệu entries, mỗi entries dài từ 1 tới hơn 10 ký tự, và độ dài của input tiếng chung thường từ một chương 4000 chữ tới cả bộ vài triệu chữ (bộ dài nhất tôi đọc có khoảng 18 triệu chữ)... nếu không dùng algo + data structure, thì đảm bảo kết quả sẽ vô cùng khó đỡ.

khi tôi làm cái chivi này, từng có một bạn liên hệ với tôi qua fb hỏi là mình cũng làm một cái tương tự cũng gần năm năm rồi, nhưng mà ra kết quả rất chậm dù rằng chỉ có 30k entries (bổ xung: riêng hán việt đã khoảng hơn 12k entries rồi, 30k entries hầu như chỉ chứa những từ phổ biến nhất, hoàn toàn không đủ).

hỏi ra mới biết là cách bạn ấy dịch rất trực quan: chạy một vòng lặp cho tất cả cặp từ trung/việt có sẵn trong từ điển, với mỗi cặp thì lại dùng hàm replace thay thế tất cả cụm trung ở trên bằng cụm việt... thực ra thì nếu chỉ có 30k từ, cho input dài 4k chữ thì nó cũng không nhiều, dù là cái server ghẻ lở thì cũng có khả năng ra kết quả sau một vài giây...

vấn đề ở đây là bạn này có dùng một cái khác gọi là "luật nhân", nói nôm na là một kiểu ngữ pháp tiếng trung, ghép lại vài cụm từ được đánh dấu danh động tĩnh các kiểu thành một cụm từ mới với cấu trúc thuần việt hơn... ờ giải thích hơi dài dòng, tóm lại thì các bạn hiểu đơn giản là phép "nhân" này biến 30k entries thành 300k thậm chí nhiều hơn, và kết quả là....

(p/s: ngoài mấy cái webapp thì trước đó có một cái desktop app gọi là QuickTranslator, và tôi cũng được nghe kể những trải nghiệm "rùng rợn" của một số bạn lạm dụng công cụ này, ví dụ 1 triệu entries từ điển x 100+ "luật nhân", nghe nói dịch một chương truyện 5k chữ thôi cũng có thể tính bằng tiếng, ăn hơn chục GB ram)

Tôi nghe loáng thoáng cũng có vài người có giải pháp tốt hơn tí, kiểu như chạy một vòng lặp duyệt cái dữ liệu input, rồi trích ra các substring (độ dài < 10 gì đấy), nếu tìm được cụm từ việt phù hợp thì lưu kết quả vào, rồi nhảy qua độ dài cụm từ trung vừa thấy... về cơ bản thì khá ổn, ngoại trừ hai chuyện là mỗi index của string đầu vào)đều phải trích ra khoảng 10 substring gì đấy rồi tìm nghĩa việt, mà tìm nghĩa việt thì tuy dùng hash_map đúng là O(1) thật, nhưng thực tế cũng không đơn giản như vậy (hashing khá tốn kém). Vấn đề thứ hai là chạy từ trái sang phải như thế không hẳn là cách tốt nhất, vì có từ cần được ưu tiên hơn từ khác; ví dụ thành ngữ thường có 4 ký tự trở lên, hoặc tên người; chỉ dịch từ trái sang phải không ra được kết quả dịch tốt nhất có thể...

Các bạn có giải pháp gì tối ưu hơn có thể vào đây chém gió, cần thiết tôi có thể đưa thêm input (một file dữ liệu từ và một file text vài MB), tôi thấy đây là bài toán khá thú vị mặc dù cấu trúc dữ liệu tối ưu (mà tôi biết) thực ra cũng khá đơn giản :"> Lần cuối cùng tôi test thì thuật toán của tôi với dữ liệu là 200k từ + 10MB text file thì mất tầm 10s để dịch xong toàn bộ (bằng nodejs), kể ra cũng khá ổn, nhưng vẫn hóng xem có bạn nào nghĩ ra giải pháp hay hơn không :">
Cho mình hỏi một chút
Tiếng Trung có gặp những cú pháp như tiếng Việt như thế này không và nếu chỉ là map từ thì theo mình hiểu sẽ không giải quyết được
"Học sinh học sinh học"
"Con ngựa đá con ngựa đá"
Phải không nhỉ
 
Cho mình hỏi một chút
Tiếng Trung có gặp những cú pháp như tiếng Việt như thế này không và nếu chỉ là map từ thì theo mình hiểu sẽ không giải quyết được
"Học sinh học sinh học"
"Con ngựa đá con ngựa đá"
Phải không nhỉ
tiếng trung cũng vậy cả, mà có khi còn hơn do từ vựng nó rộng. ví dụ chúng nó có câu nổi tiếng "đại khả đạo phi thường đạo", nhét dấu phẩy vào chỗ nào cũng làm câu biến nghĩa :))

nhiều khi chỉ thừa thiếu một chữ thôi cũng làm nghĩa câu khác hẳn, nên thường thì dịch máy trung việt kiểu này có workaround là nhét cả cụm từ dài vào rồi đưa nghĩa (ví dụ map nghĩa của cả cụm học sinh học sinh học trên). nhưng nhiều khi thêm cụm từ xong nó đúng ở trong văn cảnh này lại sai ở văn cảnh khác, lại phải xoá, khá phiền.

làm rồi cũng hiểu được tại sao google về sau đổi sang AI, tuy dịch kiểu map nghĩa 1/1, phân loại từ nó hiện tại ra kết quả tốt hơn, nhưng tương lai là con đường cụt, AI bây giờ rất kém nhưng vài chục năm nữa thì không biết thế nào. input đủ nhiều có khi nó cũng hiểu hơn context, dùng context đưa ra các lựa chọn chính xác hơn mà kiểu dịch trước không làm được.
 
code mobile thì chịu khó xài cái này nhiều vô, tôi dùng cây nhị phân để lưu trữ dự liệu nè, rồi viết ra thành 1 lib, mấy app mobile hay game thì cứ gắn lib vô bao xài, gọi thông tin ra nhanh hơn dùng sql hay json lưu trữ
ra ngoài đi làm thì tôi dùng khá nhiều lý thuyết của toán rời rạc để áp vào code và mind set, chứ gọi API ra để chạy thì perf kém lắm, chưa kể tính linh hoạt của ứng dụng hay thư viện để nâng cấp và dùng cho các dự án sau nữa
ko dùng API thì viết app ra tự kỷ, chơi với dế à !
 
Ma trận kích thước bao nhiêu, cần nhân bao nhiêu lần?

Dùng trie hay suffix tree chỉ mất O(m) thời gian thôi.
Phép search tree thì đúng là có điểm yếu về không tận dụng tốt CPU cache, cứ cho là miss cache L3 100% thì một lần tìm kiếm một byte trong tree mất khoảng tối đa 200 cycle.
Phép nhân ma trận độ phức tạp khoảng O(m*n*p), chấp luôn cache hit 100% latency 0, sử dụng AVX256 tính được 8 phép tính cùng lúc thì chỉ cần mnp > 1600 là chậm hơn tree rồi. Mà với mấy cái model ML ngày nay thì con số đó chỉ là muỗi.
e cũng đang tập tành học code, e có 1 thắc mắc khúc này đó là về vấn đề data, bình thường thì với lượng data ntn, e vẫn chưa hiểu tại sao ta có thể áp dụng algorithm vào, vì lúc get data từ DB các bác get hết lên hay sao ạ, hay là chỉ truyền param vào rồi tối ưu ở phần xử lí sql nhỉ ?
 
Back
Top