时间复杂度

数据结构&算法入门

匿名 (未验证) 提交于 2019-12-03 00:22:01
数据结构是存储,组织 数据 的 方式 算法是完成一个目标的 方法 和 ˼· 公司的核心价值点起始与数据,数据可以预判趋势,指导方向,解决实际问题,掌握了公司的数据,就掌握了公司运营和发展的命脉 是做技术的基础中的基础,是高技术人才的必备能力 装逼利器 什么是数据结构,什么是算法,他们之间的关系,抽象数据类型 数据结构: 数据组织的方式 数据的种类有很多种:整型,浮点型,字符串。。。 数据的组织方式:字典,列表,元组。。。 举例子:数据:‘老王’ 10 ‘男’ 组织方式:列表:[‘老王’,10, ‘男’], 字典{name:’老王’,age:18,gender:’男’} 物理形式 顺序表 链表 逻辑形式 集合,线性,树形,图型 算法 解决问题的方法和思路 公司的核心是 数据 ,数据的组织方式是数据结构,怎么利用这些数据结构完成公司的业务需求,就用到了算法 评判算法的好坏的标准:算法复杂度 时间复杂度:完成一个目标所花费的时间 空间复杂度:完成一个目标所花费的内存空间 数据结构+算法 == 程序,也就是业务需求 程序 + 语言 == 编程 抽象数据类型就是将数据和在这个数据上的运算捆绑在一起。 如魂斗罗中的人物是一种数据类型,打子弹是动作,点击空格键使人物发子弹,那么按一下空格键就生成了一个 抽象数据类型:人物打子弹 为什么引入抽象数据类型的概念

数据结构:时间复杂度和空间复杂度

匿名 (未验证) 提交于 2019-12-03 00:21:02
我们知道,同一问题可用不同算法解决,而一个算法的质量优劣将影响到算法乃至程序的效率。算法分析的目的在于选择合适算法和改进算法。那么一个算法的好坏又由很多因素决定和影响,那么我们怎么衡量一个算法的好坏呢?这里我们引出来 算法复杂度 的概念。算法复杂度又分为 时间复杂度 和 空间复杂度 。下面我们就一一来详细看下时间复杂度和空间复杂度。 首先我们看下官方是怎么定义时间复杂度的:算法的时间复杂度是一个函数,它定性描述了该算法的运行时间。这是一个关于代表算法输入值的字符串的长度的函数。时间复杂度常用大O符号表述,不包括这个函数的低阶项和首项系数。使用这种方式时,时间复杂度可被称为是渐近的,它考察当输入值大小趋近无穷时的情况。那我们自己通俗一点的解释就是时间复杂度其实就是一个 函数 ,这个函数的功能是什么呢?是 计算执行基本操作的次数 。也就是程序中哪些操作或语句在大量执行,将这些操作认为是整个程序中占用的时间的大小。并且要知道时间复杂度是一个 趋势 ,不是精确的数值,只是粗略 数量级 。 还是用例子能更好的说明问题,我们看下面这个例子: void Test ( int n ) { int iCount = 0 ; for ( int i = 0 ; i < n ; ++ i ) { for ( int j = 0 ; j < 0 ; ++ j ) { iCount ++; } } for

杨氏矩阵中查找一个数,时间复杂度小于O(N)

匿名 (未验证) 提交于 2019-12-03 00:19:01
【问题描述】: 杨氏矩阵 有一个二维数组. 数组的每行从左到右是递增的,每列从上到下是递增的. 在这样的数组中查找一个数字是否存在。如果存在返回坐标,不过不存在,返回不存在. 时间复杂度小于O(N); 例如数组: 1 2 3 4 5 6 7 8 9 【解决思路】:简单的办法是将二维数组遍历一遍,依次比较,但是这样的话时间复杂度肯定大于o(n),不符合题目要求。 我们要想做到时间复杂度小于 o(n) ,只能根据杨氏矩阵的性质来查找,假设在上边的数组中我们要查找5,首先我们确定右上角的元素4,4<5,则现在我们可以去掉第一行,因为 杨氏矩阵的每一行 的元素是递增的;如果要找的数小于右上角的数,可以直接去掉一列,因为杨氏矩阵的每一列也是递增的。 【参考代码】: #include<stdio.h> #include<windows.h> #define ROW 3 #define COL 3 struct point { int x; int y; };//定义一个结构体返回坐标 struct point find_key(int arr[ROW][COL], int key) { int x = 0; int y = COL-1; struct point ret = { -1,-1 }; while ((x <=ROW-1) && (y >= 0)) { if (key == arr

LintCode-607: Two Sum III

匿名 (未验证) 提交于 2019-12-03 00:19:01
该题用Array或HashTable都可以。 Array: add()时间复杂度O(n),find()时间复杂度O(n)。 HashTable: add()时间复杂度O(1), find()时间复杂度O(n)。 解法1:Array。add()用类似插入排序。find()用双指针。 代码: class TwoSum { public : /* * @param number: An integer * @return: nothing */ void add( int number) { nums.push_back(number); int i= 0 , pos= 0 ; int len=nums.size(); //similar to insertion sort for (i= 0 ; i<len- 1 ; ++i) { if (number<=nums[i]) { break ; } } pos=i; for (i=len- 1 ; i>pos; --i) { nums[i]=nums[i- 1 ]; } nums[pos]=number; } /* * @param value: An integer * @return: Find if there exists any pair of numbers which sum is equal to the value. *

走进数据结构和算法(c++版)(1)――算法时间复杂度

匿名 (未验证) 提交于 2019-12-03 00:18:01
算法时间复杂度定义 T ( n ) T ( n ) 是关于问题规模 n n 的函数,进而分析 T ( n ) T ( n ) 随 n n 的变化情况并确定 T ( n ) T ( n ) 的数量。算法的时间复杂度。也就是算法的时间量度,记做: T ( n ) = O ( f ( n ) ) T ( n ) = O ( f ( n ) ) 。它表示随问题规模 n n 的增大,算法执行时间的增长率和 f ( n ) f ( n ) 的增长率相同,称作算法的 渐近时间复杂度 ,简称为 时间复杂度 。 其中 f ( n ) f ( n ) 是问题规模 n n 的某个函数。 T ( n ) T ( n ) 随问题规模 n n 增加的变化趋势。 一般情况下,随着 n n 的增大, T ( n ) T ( n ) 增长最慢的算法为最优算法。 用常数 1 取代运行时间中的所有加法常数。 再修改后的运行次数函数中,只保留最高阶项。 如果最高阶项存在且不是 1 ,则去除与这个项相乘的常数。 时间复杂度 O ( 1 ) O ( 1 ) int a = 1 ,b= 3 , sum = 0 ;//执行1次 sum = a +b ;//执行1次 cout<< "sum=" << sum <<endl ;//执行1次 时间复杂度 O ( n ) O ( n ) for ( int i = 0 ; i < n;

数组和链表

匿名 (未验证) 提交于 2019-12-03 00:14:01
数组静态分配内存,链表动态分配内存; 数组在内存中连续,链表不连续; 数组元素在栈区,链表元素在堆区; 数组利用下标定位,时间复杂度为O(1),链表定位元素时间复杂度O(n); 数组插入或删除元素的时间复杂度O(n),链表的时间复杂度O(1)。 注: 通常:1、基本数据类型(整数类型:byte、short、int、long;浮点数类型:float、double;布尔类型:boolean;字符类型:char;) 变量, 2、一个对象的引用, 3、函数调用的现场保存 栈空间; 4、而通过new关键字和构造器创建的对象放在堆空间; 5、程序中的字面量(literal)如直接书写的100、”hello”和常量都是放在静态区中 6、栈空间操作起来最快但是栈很小,通常大量的对象都是放在堆空间。 来源:博客园 作者: NOT_COPY 链接:https://www.cnblogs.com/mww-NOTCOPY/p/11647438.html

1、时间复杂度

匿名 (未验证) 提交于 2019-12-03 00:12:02
import time start_time = time.time() for a in range(0, 1001): for b in range(0, 1001): for c in range(0, 1001): if a**2 + b**2 == c**2 and a+b+c == 1000: print("a, b, c: %d, %d, %d" % (a, b, c)) end_time = time.time() print("elapsed: %f" % (end_time - start_time)) print("complete!") a, b, c: 0, 500, 500 a, b, c: 200, 375, 425 a, b, c: 375, 200, 425 a, b, c: 500, 0, 500 elapsed: 214.583347 complete! 依据三个变量之间的关系,减少一个变量,降低维度 import time start_time = time.time() for a in range(0, 1001): for b in range(0, 1001): c = 1000-a-b if a**2 + b**2 == c**2: print("a, b, c:%d, %d, %d" % (a, b, c)) end_time =

NOI 时间复杂度

匿名 (未验证) 提交于 2019-12-03 00:08:02
【问题描述】 小明正在学习一种新的编程语言 A++,刚学会循环语句的他激动地写了好多程序并 给出了他自己算出的时间复杂度,可他的编程老师实在不想一个一个检查小明的程序, 于是你的机会来啦!下面请你编写程序来判断小明对他的每个程序给出的时间复杂度是 否正确。 A++语言的循环结构如下: 其中“F i x y”表示新建变量 i(变量 i 不可与未被销毁的变量重名)并初始化为 x, 然后判断 i 和 y 的大小关系,若 i 小于等于 y 则进入循环,否则不进入。每次循环结束 后 i 都会被修改成 i +1,一旦 i 大于 y 终止循环。 x 和 y 可以是正整数(x 和 y 的大小关系不定)或变量 n。n 是一个表示数据规模的 变量,在时间复杂度计算中需保留该变量而不能将其视为常数,该数 远大于 100。 “E”表示循环体结束。循环体结束时,这个循环体新建的变量也被销毁。 注:本题中为了书写方便,在描述复杂度时,使用大写英文字母“O”表示通常意 义下“Θ”的概念。 【输入输出样例 1】 第三个程序有一个 F 开启循环却没有 E 结束,语法错误。 第四个程序二重循环,n 的平方的复杂度。 第五个程序两个一重循环,n 的一次方的复杂度。 第六个程序第一重循环正常,但第二重循环开始即终止(因为n远大于100,100大于4)。 第七个程序第一重循环无法进入,故为常数复杂度。

图书检索系统

匿名 (未验证) 提交于 2019-12-03 00:03:02
原创,转载请注明出处! 程序具有一下功能 窗口界面 1,Input输入(读入文件,所有的文件都读入) 2,Output输出(检验是否读取正确,从结构体数组读入) 3,Length统计(此文件里有110本图书) 4,Locate查找(根据图书的名字查找,可根据输入的图书名称查找该图书所在的位置从1开始,满足该名称的图书有多本,都要输出,输出满足条件图书的所有信息) 5,Get(该查找有个位置i,找出该列表中第i本书的信息,结果唯一) 6,Insert(i,插入新的图书,在指定位置i插入图书,总数+1,反映到文件中,要回写入文件,验证过程,重新调用1,2) 7,Delete(删除,总数减1,反映到文件中,要写回源文件,验证过程) 8,Sort(排序,按价格排序,升序,快速排序,堆排序,用不同的方法尝试) 9.Max(价格最高的图书,打印出一条记录,或多条记录)要求时间复杂度为一次即O(n) 10.Inverse(逆转存储) 注释时间、空间复杂度 代码如下 #include <iostream> #include <fstream> #include <string> #include <cstdlib> #include <string.h> #include <math.h> #include <cstring> using namespace std; struct

关于时间与空间复杂度的学习

匿名 (未验证) 提交于 2019-12-03 00:02:01
一、算法时间复杂度定义 在进行算法分析时,语句总的执行次数 T(n) 是关于问题规模 n 的函数,进而分析 T(n) 随 n 的变化情况并确定 T(n) 的数量级。算法的时间复杂度,也就是算法的时间量度。 记作:T(n)=O(f(n)) 。 它表示随问题 n 的增大, 算法执行时间的增长率和f(n)的增长率相同,称作算法的渐进时间复杂度,简称为时间复杂度 。其中,f(n)是问题规模n的某个函数。 二、标准算法度量单位 渐近记号 1、Θ(big-theta) 若存在正常量 c1、c2和n0 ,使得当 n ≥ n0 时,不等式0 ≤ c1g(n) ≤ f(n) ≤ c2g(n) 恒成立,则称g(n)是f(n)的一个渐近紧确界,记作Θ。它包含 渐近上界 和 渐近下界 。 简单的理解为在 n ≥ n0 时,f(n)被夹在c1g(n)和c2g(n)之间,c1g(n)为f(n)的 渐近下界 ,c2g(n)为f(n)的 渐近上界 ,如下图所示。 2、O(big-oh) 若存在正常量c和n0,使得当n ≥ n0 时,不等式 0 ≤ f(n) ≤ cg(n)恒成立,则称g(n)是f(n)的一个 渐近上界 ,记作O。 简单的理解为在 n ≥ n0 时,cg(n)总是在f(n)之上。cg(n)为f(n)的 渐近上界 。如下图所示。 3、Ω(big-omege) 若存在正常量 c和n0,使得当 n ≥