Skip to main content

AI Agents: What They Are and How They Will Change Work

Artificial intelligence has moved beyond simply answering questions and generating text. A new generation of AI systems—known as AI agents—is emerging with the ability to plan tasks, use tools, make decisions, and complete multi-step workflows with less human intervention. From managing emails and analyzing data to writing software and assisting customers, AI agents could significantly change how people work. What Are AI Agents? An AI agent is a software system that can perceive information, reason about a goal, take actions, and adapt based on the results. Traditional AI tools usually respond to a specific instruction. For example, you might ask an AI chatbot to summarize a document, and it provides a summary. An AI agent can go further. You could give an agent a goal such as: "Research three competitors, compare their pricing, summarize their main features, and prepare a report." The agent may then: 1) Understand the objective. 2) Break the task into smaller steps. 3) Searc...

Big O Notation

BIG O NOTATION
In today’s era of massive advancement in computer technology, we are hardly concerned about the efficiency of algorithms. Rather, we are more interested in knowing the generic order of the magnitude of the algorithm. If we have two different algorithms to solve the same problem where one algorithm executes in 10 iterations and the other in 20 iterations, the difference between the two algorithms is not much. However, if the first algorithm executes in 10 iterations and the other in 1000 iterations, then it is a matter of concern.
We have seen that the number of statements executed in the program for n elements of the data is a function of the number of elements, expressed as f(n). Even if the expression derived for a 
function is complex, a dominant factor in the expression is sufficient to determine the order of the magnitude of the result and, hence, the efficiency of the algorithm. This factor is the Big O, and is expressed as O(n).
The Big O notation, where O stands for ‘order of’, is concerned with what happens for very large values of n. For example, if a sorting algorithm performs n2 operations to sort just n elements, then that algorithm would be described as an O(n2) algorithm.
When expressing complexity using the Big O notation, constant multipliers are ignored. So, an O(4n) algorithm is equivalent to O(n), which is how it should be written.
If f(n) and g(n) are the functions defined on a positive integer number n, then
f(n) = O(g(n))
That is, f of n is Big–O of g of n if and only if positive constants c and n exist, such that f(n)£cg(n). It means that for large amounts of data, f(n) will grow no more than a constant factor than g(n). Hence, g provides an upper bound. Note that here c is a constant which depends on the 
following factors:
* the programming language used,
* the quality of the compiler or interpreter,
* the CPU speed,
* the size of the main memory and the access time to it,
* the knowledge of the programmer, and
* the algorithm itself, which may require simple but also time-consuming machine instructions.
We have seen that the Big O notation provides a strict upper bound for f(n). This means that the function f(n) can do better but not worse than the specified value. Big O notation is simply written as f(n) ∈ O(g(n)) or as f(n) = O(g(n)).
Here, n is the problem size and O(g(n)) = {h(n): ∃ positive constants c, n0 such that 0 ≤ h(n) ≤ cg(n), ∀ n ≥ n0}. Hence, we can say that O(g(n)) comprises a set of all the functions h(n)that are less than or equal to cg(n) for all values of n ≥ n0.
If f(n) ≤ cg(n), c > 0, ∀ n ≥ n0
, then f(n) = O(g(n)) and g(n) is an asymptotically tight upper 
bound for f(n).
Examples of functions in O(n3) include: n2.9, n3, n3+ n, 540n3 + 10.
Examples of functions not in O(n3) include: n3.2, n2, n2+ n, 540n + 10, 2n
To summarize, 
• Best case O describes an upper bound for all combinations of input. It is possibly lower than the worst case. For example, when sorting an array the best case is when the array is already correctly sorted.
• Worst case O describes a lower bound for worst case input combinations. It is possibly greater than the best case. For example, when sorting an array the worst case is when the array is sorted in reverse order.
• If we simply write O, it means same as worst case O.Now let us look at some examples of g(n) and f(n).Below table shows the relationship between g(n) and f(n). 
Table: Examples of f(n) and g(n)
Note that the constant values will be ignored because the main purpose of the Big O notation is to analyse the algorithm in a general fashion, so the anomalies that appear for small input sizes are simply ignored.

Categories of Algorithms
According to the Big O notation, we have five different categories of algorithms:
* Constant time algorithm: running time complexity given as O(1)
* Linear time algorithm: running time complexity given as O(n)
* Logarithmic time algorithm: running time complexity given as O(log n)
* Polynomial time algorithm: running time complexity given as O(nk) where k > 1
* Exponential time algorithm: running time complexity given as O(2n)
Below shows the number of operations that would be performd for various values of n.
Table : Number of operations for different functions of n

Limitations of Big O Notation
There are certain limitations with the Big O notation of expressing the complexity of algorithms. These limitations are as follows:
* Many algorithms are simply too hard to analyse mathematically.
* There may not be sufficient information to calculate the behaviour of the algorithm in the average case.
* Big O analysis only tells us how the algorithm grows with the size of the problem, not how efficient it is, as it does not consider the programming effort.
* It ignores important constants. For example, if one algorithm takes O(n2) time to execute and the other takes O(100000n2) time to execute, then as per Big O, both algorithm have equal time 
complexity. In real-time systems, this may be a serious consideration.

Popular posts from this blog

MEMORY MAPPED FILES

Memory-mapped files           Rather than retriving data files directly via the file system with every file access, data files can be paged into memory the same as process files, resulting in much faster retrieves ( except of course when page-faults occur. ) This is called as memory-mapping a file. Basic Mechanism * Basically a file is mapped to an address range within a process's virtual address space, and then paged in as required using the ordinary demand paging system. * Note that file matches are made to the memory page frames, and are not immediately written out to disk. ( This is the purpose of the "flush( )" system call, which may also be needed for stdout in some cases. See the time killer program for an example of this) * This is also why it is important to "close()" a file when one is done writing to it - So that the data can be safely flushed out to disk and so that the memory frames can be release for other purposes. * Some systems issue special sys...

how to improve your English vocabulary easily

Improving your English vocabulary is an essential skill for anyone who wants to communicate effectively in English. Whether you are a student, a professional, or a casual learner, having a strong vocabulary can make a significant difference in your language proficiency. However, building a robust English vocabulary may seem daunting, especially if English is not your native language. In this blog post, we will explore some effective ways to improve your English vocabulary easily. Read regularly One of the most effective ways to build your English vocabulary is by reading regularly. Reading exposes you to new words and phrases, which can help expand your vocabulary. Start with simple books, newspapers, or magazines and gradually move to more complex materials. You can also read online articles, blogs, or websites on topics that interest you. Make it a habit to look up any unfamiliar words and learn their meanings. Use flashcards Flashcards are an excellent tool for learning and memoriz...

Deadlock Characterisation

Deadlock Characterization Necessary Conditions: There are four conditions that are required to achieve deadlock: Mutual Exclusion  - At least one resource must be grip in a non-sharable mode; If any other process requests this resource, then that process must wait for the resource to be released. Hold and Wait  - A process must be concurrently gripping at least one resource and waiting for at least one resource that is presently being grip by some other process. No preemption  - Once a process is belonging a resource ( i.e. once its request has been allowed ), then that resource not be taken away from that process until the process freely releases it. Circular Wait -  A group of processes { P0, P1, P2, . . ., PN } must exist such that every P[ i ] is waiting for P[ ( i + 1 ) % ( N + 1 ) ]. ( Note that this situation implied the hold-and-wait condition, but it is easier to deal with the conditions if the four are considered individually. ) Resource-Allocation Graph In...