1.贪婪算法(greedy<wbr>algorithm) </wbr>
该算法每一步所做的都是当时最紧迫、最有利或许最满意的,不会思考所做的成果,直到完成任务。这种算法的稳定性很差,很简单带来严重成果,可是,若是方向正确,那该算法也是高效的。
2.分治算法(divide-and-conquer<wbr>algorithm) </wbr>
该算法就是将一个大问题分解成许多小问题,然后独自处置这些小问题,最终将成果结合起来形成对整个问题的解决方案。当子问题和总问题类型相似时,该算法很有用,递归就归于该算法。
3.回溯算法(backtracking<wbr>algorithm) </wbr>
也可以称之扫除算法,一种安排好的试错法。某一点,若是有多个挑选,则恣意挑选一个,若是不能解决问题则退回挑选另一个,直到找到正确的挑选。这种算法的功率很低,除非命运好。比方迷宫就可以运用这种算法来完成。
实际上,咱们对算法的功率凹凸评估,首要是在工夫和内存之间权衡。依据实际情况来决议,比方有的客户不在乎耗用的内存是多少,他在乎的是履行的速度,那么一个用内存来交换更高履行工夫的算法能够是更好的。相同,有的客户能够不想耗用过多内存一起对速度也不是独特需求。不论怎样,功率是算法的首要特性,因而重视算法的功能特别重要!规范的丈量方法就是找出一个函数(增加率),将履行工夫表明为输入巨细的函数。挑选处置的输入巨细来说增加率比拟低的算法!
核算增加率的方法:
1.丈量履行工夫
经过System.currentTimeMillis()方法来测验
局部代码:
//<wbr>丈量履行工夫</wbr>
static<wbr>void<wbr>calculate_time(){</wbr></wbr>
long<wbr>test_data<wbr>=<wbr>1000000;</wbr></wbr></wbr>
long<wbr>start_time<wbr>=<wbr>0;</wbr></wbr></wbr>
long<wbr>end_time<wbr>=<wbr>0;</wbr></wbr></wbr>
int<wbr>testVar<wbr>=<wbr>0;</wbr></wbr></wbr>
for<wbr>(int<wbr>i<wbr>=<wbr>1;<wbr>i<wbr><=<wbr>5;<wbr>i ){</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
//<wbr>算法履行前的当时工夫</wbr>
start_time<wbr>=<wbr>System.currentTimeMillis();</wbr></wbr>
for(int<wbr>j<wbr>=<wbr>1;<wbr>j<wbr><=<wbr>test_data;<wbr>j ){</wbr></wbr></wbr></wbr></wbr></wbr></wbr>
testVar ;
testVar--;
}
//<wbr>算法履行后的当时工夫</wbr>
end_time<wbr>=<wbr>System.currentTimeMillis();</wbr></wbr>
//<wbr>打印一共履行工夫</wbr>
System.out.println("test_data<wbr>=<wbr>"<wbr><wbr>test_data<wbr><wbr>"\n"<wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
"Time<wbr>in<wbr>msec<wbr>=<wbr>"<wbr><wbr>(end_time<wbr>-<wbr>start_time)<wbr><wbr>"ms");</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
<wbr><wbr><wbr><wbr><wbr>//环后将循环次数加倍</wbr></wbr></wbr></wbr></wbr>
test_data<wbr>=<wbr>test_data<wbr>*<wbr>2;</wbr></wbr></wbr></wbr>
}
}
以上代码将别离核算出1000000、2000000、4000000...次的循环工夫。
缺陷:
?<wbr>不相同的平台履行的工夫不相同</wbr>
?<wbr>有些算法跟着输入数据的加大,测验工夫会变得不切实际!</wbr>
2.指令计数
指令---指编写算法的代码.对一个算法的完成代码核算履行指令次数。两种类型指令:不论输入巨细,履行次数永久不变;履行次数跟着输入巨细改动而改动。通常,咱们首要测验后一种指令。
例:核算指令履行次数
static<wbr>void<wbr>calculate_instruction(){</wbr></wbr>
long<wbr>test_data<wbr>=<wbr>1000;</wbr></wbr></wbr>
int<wbr>work<wbr>=<wbr>0;</wbr></wbr></wbr>
for<wbr>(int<wbr>i<wbr>=<wbr>1;<wbr>i<wbr><=<wbr>5;<wbr>i ){</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
int<wbr>count<wbr>=<wbr>0;<wbr></wbr></wbr></wbr></wbr>
for<wbr>(int<wbr>k<wbr>=<wbr>1;<wbr>k<wbr><=<wbr>test_data;<wbr>k ){</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
for(int<wbr>j<wbr>=<wbr>1;<wbr>j<wbr><=<wbr>test_data;<wbr>j ){</wbr></wbr></wbr></wbr></wbr></wbr></wbr>
//<wbr>指令履行次数计数</wbr>
count ;
work ;
work--;
}
}
System.out.println("test_data<wbr>=<wbr>"<wbr><wbr>test_data<wbr><wbr>"\n"<wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
"Instr.<wbr>count<wbr>=<wbr>"<wbr><wbr>count<wbr>);</wbr></wbr></wbr></wbr></wbr></wbr>
test_data<wbr>=<wbr>test_data<wbr>*<wbr>2;</wbr></wbr></wbr></wbr>
}
}
3.代数核算
代码1:
long<wbr>end_time<wbr>=<wbr>0;t1</wbr></wbr></wbr>
int<wbr>testVar<wbr>=<wbr>0;t2</wbr></wbr></wbr>
for<wbr>(int<wbr>i<wbr>=<wbr>1;<wbr>i<wbr><=<wbr>test_data;<wbr>i ){<wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr><wbr>t3</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
testVar ;t4
testVar--;t4
}
假定t1<wbr>---<wbr>t4别离代表每条句子的履行工夫,那么,以上代码的总履行工夫为:t1<wbr><wbr>t2<wbr><wbr>n(t3<wbr><wbr>2t4).其间n<wbr>=<wbr>test_data,当test_data增大时,t1和t2可以忽略不计,也就是说,关于很大的n,履行工夫可以近似于:n(t3<wbr><wbr>2t4)</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
4.丈量内存运用率
一个算法中包括的目标和引证的数目,越多则内存运用越高,反之越低。
比拟增加率:
1.代数比拟法
条件1:c≦<wbr>f(n)/g(n)<wbr>≦<wbr>d<wbr>(其间c和d为正常数,n代表输入巨细)</wbr></wbr></wbr></wbr>
当满意以上条件1时,则f(n)和g(n)具有相同的增加率,或许两函数复杂度的阶相同!
如:f(n)<wbr>=<wbr>n<wbr><wbr>100<wbr><wbr>和<wbr><wbr>g(n)<wbr>=<wbr>0.1n<wbr><wbr>10两函数就具有相同的增加率。</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
条件2:<wbr>当n增大时,f(n)/g(n)趋向于0</wbr>
当满意此条件2时,则该两个增加函数有不相同的增加率。
比方:f(n)<wbr>=<wbr>10000n<wbr><wbr>20000<wbr><wbr>和<wbr><wbr>g(n)<wbr>=<wbr>n?2<wbr><wbr>n<wbr><wbr>1<wbr>。请咱们比拟以上两函数增加率能否相同,若是不相同,谁的增加率小?</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
2.大O表明法
若是f的增加率小于或许等于g的增加率,则咱们可以用如下的大O表明法:
f<wbr>=<wbr>O(g)</wbr></wbr>
O表明on<wbr>the<wbr>order<wbr>of</wbr></wbr></wbr>
将代码1的代数增加率函数用大O表达式如下:
f(n)<wbr>=<wbr>t1<wbr><wbr>t2<wbr><wbr>n(t3<wbr><wbr>2t4)</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
=<wbr>a1*n<wbr><wbr>a</wbr></wbr></wbr>
=<wbr>O(n)</wbr>
其间a1<wbr>=<wbr>t3<wbr><wbr>2t4;<wbr>a<wbr>=<wbr>t1<wbr><wbr>t2</wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
3.最佳、最差、均匀功能
对每一个算法不能只思考单一的增加率,而应该给出最佳、最差、均匀的增加率函数
相关推荐
本文将深入探讨“算法类型”这一主题,特别是在离散数学背景下的应用,以及如何使用Java语言实现它们。 离散数学是计算机科学的重要分支,它研究不连续的对象和关系。在算法设计中,离散数学提供了一种严谨的逻辑...
常见密码算法类型.png
常见的算法类型及其简要介绍以及一个经典算法题的解析与代码示例
二、常见算法类型 1. 排序算法:用于对数据进行有序排列,如冒泡排序、选择排序、插入排序、快速排序、归并排序和堆排序等。它们各有优缺点,适用于不同规模和性能需求的场景。 2. 搜索算法:寻找数据结构中特定...
这意味着内容可能涵盖了算法的基础概念、常用算法类型及其应用,如排序算法(冒泡排序、快速排序、归并排序等)、搜索算法(深度优先搜索、广度优先搜索、二分查找等)、图论问题(最短路径、最小生成树等)以及动态...
算法实现题2-1是书中的一个重要练习,虽然具体的题目内容没有给出,但通常这类题目会涉及基础的算法类型,如排序、查找、图论或者动态规划等。在计算机科学的学习过程中,实践和理解算法的实现是至关重要的。下面...
其次,掌握常见算法类型和设计技巧也是必要的。这包括分治策略(如归并排序)、动态规划(如背包问题)、贪心算法(如霍夫曼编码)以及回溯和分支限界法等。了解这些方法可以帮助我们解决更复杂的问题。 此外,学习...
本文将深入探讨MATLAB在智能算法领域的应用,结合提供的压缩包文件"MATLAB智能算法代码",我们将重点讲解其中可能包含的算法类型、实现方式以及其在实际问题中的应用。 一、智能算法概述 智能算法是一类模仿生物...
2. **常见算法类型**: - 排序算法:如冒泡排序、插入排序、选择排序、快速排序、归并排序、堆排序等,每种排序算法都有其适用场景和优缺点。 - 搜索算法:如线性搜索、二分搜索、哈希搜索等,它们在数据查找中起...
首先,我们要了解ACM竞赛中的核心算法类型,主要包括排序、搜索、图论、动态规划、数学和字符串处理等。排序算法如快速排序、归并排序、堆排序等,它们在处理大量数据时起着关键作用。搜索算法如深度优先搜索(DFS)...
《算法竞赛入门经典》一书涵盖了这些基础的算法类型,帮助读者全面认识和学习。 3. 数据结构:数据结构是算法中不可或缺的部分,包括数组、链表、栈、队列、树、图等基本数据结构的使用和算法实现。 4. 编程实现:...
三、常见算法类型 试卷中可能包含以下经典算法的考察: 1. 排序算法:冒泡排序、插入排序、选择排序、快速排序、归并排序、堆排序等。 2. 搜索算法:深度优先搜索(DFS)、广度优先搜索(BFS)、二分查找、哈希表...
算法的种类繁多,根据不同的问题和场景,常见的算法类型包括但不限于: 1. **递归**:通过调用自身来解决问题的方法,适用于具有重复子结构的问题。 2. **动态规划**:通过将问题分解为更小的重叠子问题,并存储子...
常见的算法类型包括排序、搜索、图论、动态规划、贪心算法等。排序算法有冒泡排序、插入排序、选择排序、快速排序、归并排序等,它们的目标是将一组数据按特定顺序排列。搜索算法如二分查找、深度优先搜索、广度优先...
3. **排序与搜索算法**:这是计算机科学中最基础的算法类型。包括冒泡排序、插入排序、选择排序、快速排序、归并排序、二分查找等。了解这些算法的工作原理,何时使用,以及它们的时间复杂度分析。 4. **图论算法**...
遗传算法的基本思想是: 从一组解的初值开始进行搜索,这组解称为一个种群, 种群由一定数量、通过基因编码的个体组成, 其中每 个个体称为染色体。不同个体通过染色体的复制、交叉 和变异又生成新的个体,依照适者...
### 常见的Java算法类型 1. **排序算法**:如冒泡排序、插入排序、选择排序、快速排序、归并排序等。这些算法在处理大量数据时尤为重要,用于按一定规则对数据进行排序。 2. **搜索算法**:包括线性搜索、二分...
以上是基于《算法导论》中文版的部分内容整理出的关键知识点,这些知识点不仅覆盖了算法的基本概念与分类,还深入探讨了算法的复杂度分析、常见的算法类型及其应用,并且介绍了几种高级算法的概念与设计技巧,最后还...
在ACM竞赛中,常见的算法类型包括但不限于: 1. **排序算法**:如快速排序、归并排序等,用于处理数据排序问题。 2. **搜索算法**:例如深度优先搜索(DFS)、广度优先搜索(BFS),用于解决图论问题中的路径寻找。 3. ...