🤖📈 Big O in the Age of AI: Because Your Model Is Smart, but Your Algorithm Might Be Expensive 💸⚙️

Hey there! 👋 I'm Hardeep Jethwani (HJ), your resident cloud aficionado and code maestro, proudly navigating the ever-changing seas of AWS Cloud and Full Stack Development for ~5 glorious years and counting. ☁️💻
Currently, I'm orchestrating the tech symphony as part of Team HSBC Bank, where I'm on a mission to enhance the banking experience through the magic of technology. 🚀💼
In my past life at Capgemini, I led exciting adventures like migrating critical applications to the cloud (18 and counting!). I had databases waltzing into the AWS Cloud, sprinkling a bit of containerization magic along the way. AWS managed services like RDS, Lambda, ECS, and friends? They were my trusty sidekicks. 🎩🔧
When not automating deployments with CI/CD finesse (think AWS CodePipeline, CodeBuild, and CodeDeploy), you might find me designing infrastructure like a digital architect using AWS CloudFormation. Security is my jam – I've got WAF, Security Groups, MFA, Cognito, and even a secret club in private subnets to keep things safe. 🔒💂♂️
On top of all that, I'm on a mission to reduce carbon footprints because, why not? HSBC's commitment to sustainability is my heart and soul. We're going for NET ZERO carbon footprint, and I'm leading the charge, one container at a time! 🌍🌱
And yes, the fun doesn't stop at work. In my past life at Tata Consultancy Services, I co-created a multi-tier Point of Sale application with a global footprint, touching the lives of billions. My automation tools were so efficient that even Father Time was left scratching his head. ⏳💡
If you're in need of a cloud-savvy comedian or a code deployment magician, look no further. Let's chat about tech, swap automation tales, or share some coding humor over a virtual coffee. Oh, and don't worry; I promise not to write code in my sleep (well, most of the time). Cheers to cloud adventures! ☕🚀
A fun guide to Big O notation, algorithmic efficiency, and why complexity matters more than ever in AI engineering. 🤖⚙️
🖼️ Featured visual: Place the Big O Cheat Sheet near the beginning of the article. Suggested alt text: “Big O time and space complexity cheat sheet covering data structures, sorting algorithms, and complexity growth.”
Artificial intelligence can write emails, generate images, summarize documents, detect diseases, recommend movies, and confidently explain code that it secretly broke five minutes ago.
But behind every impressive AI system is a less glamorous reality:
📥 Data must be loaded.
🔤 Tokens must be processed.
🔎 Embeddings must be searched.
🧮 Matrices must be multiplied.
💾 Memory must be allocated.
💸 Cloud bills must be paid.
This is where Big O notation becomes extremely important.
Big O is not just a topic created to make coding interviews uncomfortable. It helps AI engineers understand whether an algorithm will work with:
100 records
or whether it will continue working with:
100 million records
An AI prototype may perform beautifully on a laptop with 20 documents.
Then production arrives with 10 million documents, 5,000 users, long prompts, vector searches, GPU workloads, and a finance team asking:
“Why did the cloud bill develop artificial intelligence of its own?”
Big O helps us answer one simple but important question:
📈 How will our computation grow when our data, model, users, or sequence length grows?
🚀 Big O Is the Scalability Language of AI
Suppose you build an AI-powered document-search application.
During development, it contains 50 documents.
Your search function compares the user’s query with every document:
def find_relevant_document(query_embedding, document_embeddings):
best_score = float("-inf")
best_document = None
for document, embedding in document_embeddings:
score = dot_product(query_embedding, embedding)
if score > best_score:
best_score = score
best_document = document
return best_document
This works perfectly.
You launch the application.
A company uploads 5 million documents.
The search still checks every document.
Your AI assistant now answers each question sometime between:
“Please wait...”
and
“The sun has expanded into a red giant.”
The problem is not necessarily the AI model.
The problem is the algorithm surrounding it.
Big O helps us identify such problems before production identifies them publicly.
🤖📊 Big O Cheat Sheet
Before we explore each complexity with code and AI examples, here is a quick visual reference you can bookmark for revision, interviews, and AI engineering discussions.
Big O Cheat Sheet covering common complexity classes, data structures, sorting algorithms, time complexity, and space complexity..
⏱️ Big O Is Not a Stopwatch
Big O does not measure the exact number of seconds taken by a program.
Execution time may depend on:
Processor speed
GPU type
Available memory
Programming language
Compiler optimizations
Network latency
Batch size
Whether someone opened 84 Chrome tabs on the training machine
Big O focuses on growth.
It asks how the required work changes as the input size increases.
The common complexity ranking is:
O(1) < O(log n) < O(n) < O(n log n) < O(n²) < O(2ⁿ) < O(n!)
Moving from left to right, the algorithm becomes increasingly difficult to scale.
For AI applications, n could represent:
Number of training examples
Number of documents
Number of vectors
Number of users
Number of tokens
Number of model parameters
Number of candidate predictions
Number of nodes in a knowledge graph
Big O does not care what n represents.
It only cares about how quickly your algorithm panics when n grows.
⚡ 1. O(1): Constant Time — The AI Engineer’s Happy Place
An O(1) operation takes approximately the same amount of work regardless of the input size.
Consider retrieving a cached AI response using a key:
response_cache = {
"what-is-big-o": "Big O describes algorithmic growth.",
"what-is-rag": "RAG combines retrieval with generation."
}
def get_cached_response(question_key: str) -> str | None:
return response_cache.get(question_key)
Whether the cache contains 100 entries or 1 million entries, dictionary lookup is generally O(1) on average.
This is one reason caching is so valuable in AI systems.
Instead of asking an expensive model to generate the same answer repeatedly, the system can return a previously computed result.
def answer_question(question: str) -> str:
cached_answer = response_cache.get(question)
if cached_answer is not None:
return cached_answer
answer = call_ai_model(question)
response_cache[question] = answer
return answer
Without caching:
User asks question
Model performs inference
GPU does work
Money leaves account
With caching:
User asks repeated question
Dictionary returns answer
GPU enjoys a brief vacation
Common O(1) operations include:
items[0] # Array access
stack.append(value) # Amortized O(1)
stack.pop() # O(1)
cache[key] # Average O(1)
seen_ids.add(record_id) # Average O(1)
Constant time does not mean the operation takes zero time.
It means its workload does not grow proportionally with the number of items.
🔍 2. O(log n): Logarithmic Time — Eliminate Half the Problem
An O(log n) algorithm reduces the search space significantly during each step.
Binary search is the classic example.
def binary_search(values: list[int], target: int) -> int:
left = 0
right = len(values) - 1
while left <= right:
middle = (left + right) // 2
if values[middle] == target:
return middle
if values[middle] < target:
left = middle + 1
else:
right = middle - 1
return -1
Binary search requires sorted data.
Instead of checking every value, it repeatedly eliminates half of the remaining candidates.
For around one million sorted values, binary search may need only about twenty comparisons.
🤖 AI Connection
AI systems frequently rely on indexing structures to avoid scanning everything.
Examples include:
Search indexes
Tree-based retrieval
Approximate nearest-neighbour indexes
Hierarchical clustering
Decision trees
Database indexes
An AI system that intelligently narrows candidates can be dramatically faster than one that compares the query against everything.
The best AI answer is not useful if retrieval takes longer than the user’s lunch break.
📊 3. O(n): Linear Time — One Visit per Record
An O(n) algorithm may inspect every item once.
Imagine validating a training dataset:
def count_missing_labels(records: list[dict]) -> int:
missing_count = 0
for record in records:
if record.get("label") is None:
missing_count += 1
return missing_count
If the dataset contains 1,000 records, the function checks 1,000 records.
If it contains 10 million records, it checks 10 million records.
The runtime grows roughly with the size of the dataset.
Linear work is common in AI:
Cleaning training data
Tokenizing documents
Computing basic statistics
Running inference over a dataset
Creating embeddings
Filtering predictions
Evaluating model results
O(n) is often reasonable because every item genuinely needs to be processed.
The goal is usually to avoid accidentally turning it into O(n²).
🧮 4. O(n log n): Efficient Sorting for AI Pipelines
Many efficient sorting algorithms operate in O(n log n) time.
AI systems sort data more often than it may appear.
For example:
Ranking recommendations
Ordering search results
Sorting prediction scores
Selecting high-confidence outputs
Arranging events by timestamp
Preparing batches by sequence length
predictions = [
{"label": "cat", "confidence": 0.72},
{"label": "dog", "confidence": 0.94},
{"label": "horse", "confidence": 0.51},
]
ranked_predictions = sorted(
predictions,
key=lambda item: item["confidence"],
reverse=True
)
print(ranked_predictions)
Python’s built-in sorting is highly optimized and has O(n log n) worst-case behaviour.
A simplified merge sort looks like this:
def merge_sort(values: list[int]) -> list[int]:
if len(values) <= 1:
return values
middle = len(values) // 2
left = merge_sort(values[:middle])
right = merge_sort(values[middle:])
return merge(left, right)
def merge(left: list[int], right: list[int]) -> list[int]:
result: list[int] = []
left_index = 0
right_index = 0
while left_index < len(left) and right_index < len(right):
if left[left_index] <= right[right_index]:
result.append(left[left_index])
left_index += 1
else:
result.append(right[right_index])
right_index += 1
result.extend(left[left_index:])
result.extend(right[right_index:])
return result
For most production systems, the built-in sorting function is preferable.
Reimplementing sorting in production without a strong reason is like building your own GPU because the existing one looked too convenient.
🔥 5. O(n²): Where AI Infrastructure Starts Sweating
Quadratic complexity often appears when every item is compared with every other item.
def compare_every_document(documents: list[str]) -> None:
for first_document in documents:
for second_document in documents:
compare_documents(first_document, second_document)
If there are n documents, this performs approximately n × n comparisons.
For 1,000 documents:
1,000,000 comparisons
For 100,000 documents:
10,000,000,000 comparisons
At that point, your system is no longer processing data.
It is creating a documentary about waiting.
🧹 Example: Duplicate Detection in an AI Dataset
Training datasets often contain duplicate or near-duplicate records.
A basic duplicate check might look like this:
def contains_duplicate_slow(values: list[str]) -> bool:
for i in range(len(values)):
for j in range(i + 1, len(values)):
if values[i] == values[j]:
return True
return False
Worst-case complexity:
O(n²)
A more efficient approach uses a set:
def contains_duplicate_fast(values: list[str]) -> bool:
seen: set[str] = set()
for value in values:
if value in seen:
return True
seen.add(value)
return False
Average time complexity:
O(n)
Additional space complexity:
O(n)
This demonstrates a common engineering trade-off:
We use more memory to reduce execution time.
AI engineering is full of such trade-offs.
More caching may reduce inference latency.
More indexing may improve retrieval.
More precomputation may reduce request-time processing.
More memory may save expensive GPU computation.
There is no free lunch, especially when the lunch is being billed by a cloud provider.
💥 6. O(2ⁿ): Every New Choice Doubles the Work
Exponential complexity appears when an algorithm explores every combination or subset.
def generate_feature_subsets(
features: list[str]
) -> list[list[str]]:
subsets: list[list[str]] = [[]]
for feature in features:
new_subsets = []
for existing_subset in subsets:
new_subsets.append(existing_subset + [feature])
subsets.extend(new_subsets)
return subsets
For n features, the number of subsets is:
2ⁿ
For 10 features:
1,024 subsets
For 30 features:
1,073,741,824 subsets
This matters in AI areas such as:
Feature selection
Hyperparameter combinations
Rule discovery
Combinatorial optimization
Planning systems
Search problems
Testing every possible feature combination may be mathematically thorough and operationally disastrous.
Instead, AI engineers use:
Greedy selection
Random search
Bayesian optimization
Genetic algorithms
Pruning
Dynamic programming
Heuristics
Sometimes the smartest algorithm is not the one that finds the perfect answer.
It is the one that finds a very good answer before the project deadline.
😵💫 7. O(n!): Brute Force Has Entered the Chat
Factorial complexity appears when every possible ordering must be explored.
from itertools import permutations
agents = ["Researcher", "Planner", "Reviewer"]
for workflow in permutations(agents):
print(workflow)
For three agents:
3! = 6 workflows
For ten agents:
10! = 3,628,800 workflows
For twenty agents:
20! = 2,432,902,008,176,640,000 workflows
Factorial algorithms appear in scheduling, routing, planning, and workflow optimization.
An AI agent that tries every possible sequence of actions may be accurate.
It may also finish shortly after humanity colonizes Mars.
Practical systems use search strategies, constraints, heuristics, beam search, and approximation rather than exploring every possibility.
🤖🚀 Why Big O Is Central to AI Engineering
Big O matters in traditional software.
In AI, it can determine whether a system is:
Trainable
Affordable
Responsive
Deployable
Scalable
Profitable
AI systems often multiply computational cost across enormous datasets, model layers, experiments, GPUs, and user requests.
A small inefficiency does not remain small.
It gets repeated.
Repeated inefficiency is how minor code becomes a major invoice.
🗂️ 1. Training Data Changes the Scale of Everything
Suppose a preprocessing function takes only one millisecond per record.
For 1,000 records, that is approximately one second.
For 100 million records:
100,000 seconds
That is more than a day of processing for a single pass.
Now imagine:
Repeating preprocessing several times
Running multiple experiments
Training several model versions
Processing data across environments
Rebuilding datasets after every update
AI workloads amplify algorithmic choices.
The question is not:
❓ “Does this function run?”
The question is:
🔁 “How many times will this function run across the complete AI lifecycle?”
🧠 2. Standard Self-Attention Has Quadratic Behaviour
Transformers process sequences of tokens.
In standard full self-attention, tokens are compared with other tokens to calculate attention scores.
For sequence length L, the attention-score matrix contains approximately:
L × L values
Its memory requirement for the score matrix grows roughly as:
O(L²)
The attention computation is often described approximately as:
O(L² × d)
where d represents the model’s hidden dimension.
A simple illustration:
def attention_score_matrix_size(
sequence_length: int,
bytes_per_value: int = 4
) -> float:
number_of_values = sequence_length * sequence_length
total_bytes = number_of_values * bytes_per_value
return total_bytes / (1024 * 1024)
for length in [512, 1024, 4096, 8192, 16384]:
size_mb = attention_score_matrix_size(length)
print(
f"{length:>5} tokens: "
f"{size_mb:>10.2f} MiB"
)
This only estimates one dense score matrix.
Actual training may require additional memory for:
Multiple attention heads
Multiple layers
Batches
Activations
Gradients
Optimizer states
Temporary tensors
When sequence length doubles, the number of pairwise attention scores becomes approximately four times larger.
This is why long-context AI is not simply a matter of changing:
max_tokens = 1000000
and hoping the GPU respects your confidence.
Long-context models require architectural and systems-level optimizations.
🔎 3. Vector Search Is an Algorithmic Problem
Modern AI applications frequently use embeddings.
Embeddings represent text, images, audio, products, or users as numeric vectors.
A simple exact search compares the query vector with every stored vector:
def dot_product(
first: list[float],
second: list[float]
) -> float:
return sum(
a * b
for a, b in zip(first, second)
)
def find_best_match(
query: list[float],
vectors: list[list[float]]
) -> int:
best_index = -1
best_score = float("-inf")
for index, vector in enumerate(vectors):
score = dot_product(query, vector)
if score > best_score:
best_score = score
best_index = index
return best_index
For N stored vectors with d dimensions, the approximate complexity is:
O(N × d)
With a few thousand vectors, this may be acceptable.
With hundreds of millions of vectors, scanning everything for every request becomes expensive.
Production vector-search systems therefore use techniques such as:
Approximate nearest-neighbour indexes
Graph-based indexes
Clustering
Quantization
Metadata filtering
Sharding
Caching
Parallel processing
In a retrieval-augmented generation system, the model may be excellent, but inefficient retrieval can still make the entire application slow.
RAG does not stand for:
😄 “Retrieve Absolutely Everything, Generate later.”
🧩 4. AI Agents Can Create Combinatorial Explosions
AI agents may:
Select tools
Plan multiple steps
Explore alternatives
Retry failed actions
Ask other agents for feedback
Evaluate possible workflows
Suppose an agent has five possible actions at every step.
After one step:
5 possibilities
After five steps:
5⁵ = 3,125 possibilities
After ten steps:
5¹⁰ = 9,765,625 possibilities
This is why agentic systems need constraints.
An unrestricted agent exploring every option is not necessarily intelligent.
It may simply be very creative at consuming tokens.
Practical agent systems use:
Maximum step limits
Tool restrictions
Search pruning
Confidence thresholds
State compression
Planning heuristics
Early stopping
Budget limits
Big O helps engineers reason about how an agent’s action space grows.
⚙️ 5. Model Inference Is Repeated at Scale
Suppose an AI model answers one request in 500 milliseconds.
For one user, that feels fast.
For 100,000 simultaneous requests, the infrastructure problem changes completely.
The system must manage:
Request queues
GPU capacity
Batch scheduling
Token generation
Memory limits
Network communication
Response streaming
Failures and retries
An operation that happens once may not deserve optimization.
An operation that runs for every generated token deserves serious attention.
In AI systems, complexity may grow across several dimensions:
Users × Requests × Tokens × Layers × Model dimension
That is why seemingly minor optimizations can create major savings.
🪙 6. Token Usage Is Also a Complexity Concern
Long prompts affect more than the model’s reading experience.
They affect:
Computation
Memory
Latency
Cost
Context management
Retrieval design
Consider an application that sends the entire company knowledge base to the model for every question.
Technically, the model receives all available context.
Financially, the finance team receives a surprise.
A better system retrieves only relevant content:
def build_prompt(
question: str,
relevant_documents: list[str]
) -> str:
context = "\n\n".join(relevant_documents)
return f"""
Use the following context to answer the question.
Context:
{context}
Question:
{question}
"""
Efficient retrieval reduces the amount of unnecessary context.
The goal is not to give the model everything.
The goal is to give it the most useful information with the least unnecessary computation.
🧪 7. Fine-Tuning and Experimentation Multiply Cost
An AI team rarely trains a model once.
It may test:
Different learning rates
Different batch sizes
Different optimizers
Different datasets
Different architectures
Different prompt templates
Different retrieval strategies
Different evaluation metrics
Imagine evaluating ten configurations across five datasets using three random seeds:
10 × 5 × 3 = 150 experiments
Now add repeated epochs and multiple model sizes.
Poorly designed evaluation code gets executed across every experiment.
An unnecessary O(n²) operation inside the evaluation pipeline may quietly consume more time than the actual improvement work.
The model may be learning.
The engineering team may simply be waiting.
⏱️💾 Time Complexity vs Space Complexity in AI
Time complexity measures how computation grows.
Space complexity measures how memory usage grows.
AI systems are often constrained by both.
Consider storing generated embeddings:
def store_embeddings(
documents: list[str],
embedding_model
) -> list[list[float]]:
embeddings = []
for document in documents:
embedding = embedding_model.encode(document)
embeddings.append(embedding)
return embeddings
The time requirement grows with the number of documents and the cost of embedding each document.
The storage requirement grows with:
Number of documents × Embedding dimension
If there are N documents and each embedding contains d values, storage is approximately:
O(N × d)
Reducing embedding precision, dimensions, or duplicate records can significantly reduce memory usage.
AI engineering is often about choosing among:
Faster computation
Lower memory
Better accuracy
Lower latency
Lower cost
You usually cannot maximize all five at the same time.
That would be less like engineering and more like requesting wishes from a genie.
🛠️ A Practical AI Example: Slow Retrieval vs Indexed Retrieval
Imagine a chatbot with one million documents.
🐢 Basic Approach
def retrieve_documents_slow(
query_embedding,
document_embeddings,
top_k: int = 5
):
scored_documents = []
for document_id, embedding in document_embeddings:
score = cosine_similarity(
query_embedding,
embedding
)
scored_documents.append(
(score, document_id)
)
scored_documents.sort(reverse=True)
return scored_documents[:top_k]
This involves:
Comparing against every vector
Storing every score
Sorting every result
Approximate complexity:
Vector comparisons: O(N × d)
Sorting: O(N log N)
🚀 Improved Thinking
A production system may:
Apply metadata filters.
Search an approximate vector index.
Retrieve a limited candidate set.
Rerank only the best candidates.
Cache common queries.
Conceptually:
def retrieve_documents_optimized(
query_embedding,
vector_index,
metadata_filter,
top_k: int = 5
):
candidates = vector_index.search(
query_embedding,
limit=100,
filters=metadata_filter
)
reranked = rerank_candidates(
query_embedding,
candidates
)
return reranked[:top_k]
The exact complexity depends on the index and implementation, but the key improvement is avoiding a full scan and full sort for every request.
This is Big O thinking applied to AI architecture.
⚠️ Big O Does Not Tell the Entire Story
Big O is essential, but it is not a complete performance report.
Two algorithms with the same Big O may perform differently due to:
Constant factors
Hardware acceleration
Memory access patterns
Parallelization
Vectorization
GPU kernels
Batch sizes
Data distribution
Implementation language
Network overhead
For example, a GPU-optimized matrix operation may outperform a Python loop even when both process similar amounts of data.
Therefore, strong AI engineering uses both:
Complexity analysis
Real-world benchmarking
Big O helps identify which approaches are likely to scale.
Profiling reveals where the system is actually spending time and memory.
The correct process is:
Reason → Implement → Measure → Optimize
Not:
Guess → Add more GPUs → Avoid checking the invoice
✅ Big O Questions Every AI Engineer Should Ask
Before approving an AI workflow, ask:
What happens when the dataset becomes 100 times larger?
What happens when the prompt becomes 10 times longer?
Are we scanning every embedding for every query?
Are we comparing every record with every other record?
Can a set, dictionary, index, or cache reduce repeated work?
Are we storing unnecessary intermediate tensors?
Can the operation be batched?
Can the search space be pruned?
Does this step run once or once per token?
Will this design still work for thousands of concurrent users?
Is additional accuracy worth the extra computation?
Are we optimizing model quality while ignoring system efficiency?
An AI product is not just a model.
It is an entire system surrounding the model.
A brilliant model inside an inefficient pipeline is like placing a Formula One engine inside a shopping cart.
The engine is impressive.
The architecture remains questionable.
🎯 Final Thoughts
Big O notation is not just about arrays, loops, and coding interviews.
In the age of AI, Big O influences:
Training time
Inference latency
Context-window scalability
Vector-search performance
Agent-planning complexity
GPU memory consumption
Dataset-processing speed
Cloud infrastructure cost
Product responsiveness
Environmental and energy impact
AI systems operate at a scale where inefficient code cannot hide for long.
A function that wastes one millisecond may be called millions of times.
A matrix that looks manageable at 1,000 tokens may become enormous at 100,000 tokens.
A search that works for 1,000 embeddings may fail completely for 100 million embeddings.
This is why every serious AI engineer should understand Big O.
Because building AI is not only about making machines intelligent.
It is also about making their intelligence computationally practical.
So the next time your AI application works perfectly with five documents, do not immediately announce that it is production-ready.
Ask the more important question:
📈 What happens when the data, tokens, users, vectors, models, and cloud bill all grow?
That is where Big O stops being theory.
That is where Big O becomes the difference between an impressive AI demo and a scalable AI product.
_______
🎯 Final Thoughts
Big O is not just an interview topic that developers memorize five minutes before a technical round and forget immediately afterward.
In the world of AI, it directly influences how quickly models train, how much memory they consume, how efficiently embeddings are searched, how long prompts can become, how many users a system can support, and how dramatically the cloud bill can surprise everyone.
A model may be intelligent, but without efficient algorithms around it, that intelligence can become slow, expensive, and difficult to scale.
So, before adding another GPU, increasing the context window, or blaming the infrastructure, take a moment to inspect the algorithm.
Sometimes the solution is not:
🖥️ “We need more computing power.”
Sometimes it is simply:
🔁 “We need fewer nested loops.”
Keep learning, keep experimenting, and always remember: an AI system should generate insights—not infinite infrastructure bills. 🤖📈💸
Whether you are exploring Big O, building your first AI application, arguing with a transformer model, or simply wondering why your innocent-looking loop consumed all the available memory, I am always happy to connect.
Let us continue learning, sharing, and building AI systems that are not only intelligent—but also fast, scalable, and financially acceptable to the cloud billing department. See you in the algorithmic AI universe, fellow builders! 🤖🌍🚀
LinkedIn: Connect with me on LinkedIn, where I share thoughts about AI, AWS, cloud engineering, software development, and occasionally pretend that debugging is an intentional learning exercise. 🚀💼 hardeepjethwani@LinkedIn
TopMate: Looking for career guidance, an AI and cloud discussion, or someone to brainstorm your next technical masterpiece over a virtual coffee? Let us connect on TopMate—because the best architectures often begin with caffeine and a slightly confusing diagram. ☕🤝 hardeepjethwani@TopMate
Instagram: Follow my technology journey, behind-the-scenes experiments, learning adventures, and those rare moments when the code works perfectly on the first attempt. 📸🤖 hardeepjethwani@Instagram
X: Join the conversation on X, where I share technology insights, AI observations, cloud knowledge, and developer humour faster than an O(1) cache lookup. 🐦⚡ hardeepjethwani@X
Want to support my AI, cloud, and educational adventures while helping keep the coffee supply in constant time? Feel free to buy me a virtual coffee. After all, caffeine might be the only truly scalable dependency in software engineering. ☕🙌
#BigO #BigONotation #ArtificialIntelligence #AI #AIEngineering #MachineLearning #GenerativeAI #Algorithms #DataStructures #DSA #TimeComplexity #SpaceComplexity #Python #Coding #Programming #SoftwareEngineering #ComputerScience #LLM #LargeLanguageModels #Transformers #SelfAttention #RAG #VectorSearch #VectorDatabase #AIArchitecture #ScalableAI #CloudComputing #TechEducation #DeveloperCommunity #BeginnerFriendly






