一、穷举法 思想:在没有很好的算法进行运算的情况下,可以尝试穷举所有情况。 EX:顺序找K值二、回溯、搜索 回溯的思想:能进则进,不能进则换,不能再后退的过程。 EX:八皇后、树和图遍历三、递归分治 思想:通过统一的方法,对整体中的部分进行循环调用,最终实现对整体的处理。 EX:二分找K值、快速排序、归并排序四、贪心法 思想:每次求解的时候都去看当前的最佳解,每次贪心求最佳最后得到的总体的结...
目录1 问题描述2 解决方案2.1 动态规划法 1 问题描述现需找零金额为n,则最少需要用多少面值为d1 < d2 < d3 < ... < dm的硬币?(PS:假设这m种面值d1 < d2 < d3 < ... < dm的硬币,其中d1 = 1,且每种硬币数量无限可得) 2 解决方案2.1 动态规划法本文编码思想参考自《算法设计与分析基础》第三版,具体讲解如下: 具体代码如下:package com.liuzhen.chapter8;publicclass ChangeMaking {publicvoid getChangeMakingN(int[] coi...
目录1 问题描述2 解决方案 1 问题描述问题描述 自己实现一个比较字符串大小的函数,也即实现strcmp函数。函数:int myStrcmp(char *s1,char *s2) 按照ASCII顺序比较字符串s1与s2。若s1与s2相等返回0,s1>s2返回1,s1<s2返回-1。具体来说,两个字符串自左向右逐个字符相比(按ASCII值大小相比较),直到出现不同的字符或遇‘\0‘为止(注意‘\0‘值为0,小于任意ASCII字符)。如: "A"<"B" "a">"A" "computer">"compare...
单调队列:队列中元素单调递增或递减,可以用双端队列实现(deque),队列的前面和后面都可以入队出队。单调队列优化dp:问题引入:dp[i] = min( a[j] ) ,i-m < j <= i普通的做法是O(nlogn),但是当n很大是,这个复杂度就不行了,考虑用单调队列优化来达到O(n)。单调队列优化dp时维护的一般都是两个值{ id(下表),value(值)},且它们都保持单调。对于这个问题,我们维护一个两个值都单调递增的序列。查询:队首不断删除,直到...
参考资料《算法(第4版)》 — — Robert Sedgewick, Kevin Wayne 归并排序的概念归并排序的实现我是这样来描述的:先对少数几个元素通过两两合并的方式进行排序,形成一个长度稍大一些的有序序列。然后在此基础上,对两个长度稍大一些的有序序列再进行两两合并,形成一个长度更大的有序序列,有序序列的的长度不断增长,直到覆盖整个数组的大小为止,归并排序就完成了。 归并排序的两种实现方式:递归和循环归并排序有两...
数据结构与算法笔记 - 绪论 1. 什么是计算2. 评判DSA优劣的参照(直尺)3. 度量DSA性能的尺度(刻度)4. DSA的性能度量的方法5. DSA性能的设计及其优化x1. 理论模型与实际性能的差异x2. DSA优化的极限(下界) 计算机与算法计算机科学(computer science)的核心在于研究计算方法与过程的规律,而不仅仅是作为计算工具的计算机本身,因此E. Dijkstra及其追随者更倾向于将这门科学称作计算科学(computing science)。计算 = 信息处理计算...
分治动态规划贪心回溯分支界定几大算法的适用范围对比 一、分治分治,就是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。分治法常常跟递归一起使用,借助递归,我们可以方便地将问题分解再将结果合并。分解:将原问题分解为若干个规模较小,相互独立,与原问题形式相同的子问题;递归:若子问题规模较小而容易被解决则直接解,否则递归...
二分查找 对于递增序列,顺序查找的时间复杂度为O(n),如果序列太大,就很难承受在有序序列中,利用二分查找可以有效减少时间复杂度,其时间复杂度为O(logn)对于递增数列,二分查找如下:#include<cstdio>
int binarySearch(int myArray[], int left, int right, int x){while(left <= right){int mid = (left + right) / 2;if(myArray[mid] == x)return mid;else if(myArray[mid] < x){left = mid + 1;}elseright = mid - 1;}retu...
上一章的算法笔记,并不算一个算法系列的一个合适的開始。而本章将会介绍一种产生随机全排列的方法,下一章開始,就正式開始我们的排序算法了。在我们的排序算法演示器中,我们须要一组随机的数据来作为排序的開始,而本章,就会产生这么一组随机数据。(一)实现分析我们须要一组随机的数据,并且似乎产生的方法不会太难。我们仅仅须要通过rand()函数获得一个随机数,让其对count(排序的规模)取模,结果作为数组的索引,其值是当...
/// <summary>/// 步骤:/// 1.记录当前待排元素/// 2.标记顺序表有序查找区域下界和上界/// 3.在顺序表有序查找区域中折半查找等待排序元素的位置/// 4.把顺序表有序查找区域的某些元素后移一位,以空出位置给等待排序的元素/// 5.在空出的位置填写当前排序元素/// </summary>/// <param name="elements"></param>staticvoid SqListSort(int[] elements) {int low; // 有序区域下界int mid; // 有序区域中界int high;// 有序...
pair的常见用法pair是一个很实用的“小玩意”,当想要将两个元素绑在一起作为一个合成元素、又不想要因此定义结构体时,使用pair可以很方便地作为一个代替品。也就是说,pair实际上可以看作一个内部有 两个元素的结构体,且这两个元素的类型是可以指定的,如下面的短代码所示:struct pair{typeName1 first;typeName2 second;
}
pair的定义头文件#include<utility>
using namespace std;
因为实现map时候已经使用了pair,所以...
二叉查找树
查找插入性能有序性相关的操作
最大键、最小键向上取整、向下取整选择、排名范围查找删除操作
删除最大键、最小键通用删除操作二叉查找树前面了解的无序链表和有序数组在性能方面至少在线性级别,无法用于数据量大的场合。接下来要学习的二叉查找树可以将链表插入的灵活性和有序数组查找的高效性结合起来,是计算机科学中最重要的算法之一。
一个二叉查找树(Binary Search Tree)是一颗二叉树,其中每个结点都含有一个...
这篇博客源于最近正在准备的面试。XX的 一个笔试题。在这简单总结一下。如题:请用任意语言,完成至少一种算法。从数据结构 软考和实际的应用中我们都有了 一定的理解。今天我们开看看。话不多说,直接贴代码。选择排序:插入排序:其实到现在,这样的代码也都很简单,平时也应该多回顾多复习一下。版权声明:本文为博主原创文章,未经博主允许不得转载。原文:http://blog.csdn.net/u010176014/article/details/46684115
一、对堆排序的相关了解1、堆排序的运行时间是 O(nlogn)
;2、定义:堆heap是一棵具有以下属性的二叉树——(1)它是一棵完全二叉树;(2)每个结点大于或等于它的任意一个孩子。 备注:完全二叉树的定义——除了最后一层没填满以及最后一层的叶子都是偏左放置的,其他层都是满的二叉树!
3、二叉堆有两种:最大堆和最小堆。在堆排序中我们使用的是最大堆,最小堆常常在构造优先队列时使用。 ...
#include <stdio.h>
constint maxn = 100;
int a[maxn] = {0};
int b[maxn]= {0};
int main(void) {int n;while(scanf("%d", &n) != EOF){for(int i=0; i<n; i++){scanf("%d", a+i);}int m;scanf("%d", &m);int j;for(int i=0; i<m; i++){scanf("%d", b+i);for(j=0; j<n; j++){if(a[j] == b[i]) break;}if (j==n) printf("NO\n");else printf("YES\n");}}
} 原文:https://www.cnblogs.com/acoccus/p/10074074.html