时间复杂度

redis 中 set 和 hset 有什么不同,什么时候使用 hset 什么时候使用set?

怎甘沉沦 提交于 2019-12-05 01:46:18
redis 中 set 和 hset 有什么不同,什么时候使用 hset 什么时候使用set? redis 中存数据时,到底什么时候用 hset 相比于 set 存数据时又有什么不一样? set 就是普通的已key-value 方式存储数据,可以设置过期时间。时间复杂度为 O(1),没多执行一个 set 在redis 中就会多一个 key , hset 则是以hash 散列表的形式存储。超时时间只能设置在 大 key 上,单个 filed 则不可以设置超时 时间复杂度我百度了很多文章都说是 O(1) 但是我下面给出的参考文章说时间上的时间复杂度其实是 O(N) N 值是单个hash 上的 filed 个数,所以 hash 上单个不适合存储大量的 filed 并且如果 filed 多了比较消耗cpu,但同时以 散列表存储则比较节省内存。 所以在实际的使用过程中应该使用 set 存储单个大文本非结构化数据 hset 则存储结构化数据,一个 hash 存储一条数据,一个 filed 则存储 一条数据中的一个属性,value 则是属性对应的值。 例如 数据库中有一张表 user 包含 id,name,age,sex 4个属性,并且有400w条数据, id,name,age,sex 1、1,张三,16,1 2、2,李四,22,1 3、3,王五,28,0 4、4,赵六,32,1 ...

程序存储问题(贪心算法)

社会主义新天地 提交于 2019-12-05 01:08:49
问题描述 条件:磁盘空间有限;程序大小不同。 在有限的磁盘上存放尽可能多的程序,就要求选择的程序尽可能小。 算法描述 贪心算法:总是从可选程序中选择最小的试放入磁盘。 1. 排序:对程序按大小升序排; 2. 循环添加:从i = 1开始,选择排序后序列的第 i 个(即a[i],1 <= i <= n)个加入暂存(sum,初始为0),判断是否满足sum小于磁盘空间,是则计数(count++),否则跳出循环; 反证法证明贪心选择可以推出最优解: 1. 证明选择可以从贪心(最小程序)开始:选择从最小程序开始即解不为空时可以选择最小程序。假设解不为空,从这样得到的选择序列中任选一个,用最小程序替换,放入程序数(count)不变; 2. 证明最优子结构性质:在解不为空、第一次可以选择最小程序的前提下,假设在最优解中去掉第一次选择的最小程序后得到的子问题的最优解的count_0大于原问题最优解的count_1-1,那么将最小程序加入选择产生的解的count_2大于count_1,此时count_1不是最优解,这不成立。故此问题具有最优子结构性质。 时间和空间复杂度分析 时间复杂度:程序进行了一次快排(O(nlogn))和循环(O(n)),故时间复杂度为O(nlogn); 空间复杂度:程序new了一个一维数组(a[n])用于存放每个程序的大小,故时间复杂度为O(n)。 心得体会

数据结构与算法之美学习笔记:第十四讲

我只是一个虾纸丫 提交于 2019-12-05 00:30:27
一、课前问题 几乎所有的编程语言都会提供排序函数,比如C语言中qsort(),C++ STL中的sort()、stable_sort(),还有Java语言中的Collections.sort()。 在平时的开发中,我们也都是直接使用这些现成的函数来实现业务逻辑中的排序功能。那你知道这些排序函数是如何实现的吗?底层都利用了哪种排序算法呢? 基于这些问题,今天我们就来看排序这部分的最后一块内容:如何实现一个通用的、高性能的排序函数? 二、如何选择合适的排序算法 如果要实现一个通用的、高效率的排序函数,我们应该选择哪种排序算法?我们先回顾一下前面讲过的一种排序算法。 我们前面讲过,线性排序算法的时间复杂度比较低,适用场景比较特殊。所以如果要写一个通用的排序函数,不能选择线性排序算法。 如果对小规模数据进行排序,可以选择时间复杂度是O(n )的算法; 如果对大规模数据进⾏排序,时间复杂度是O(nlogn)的算法更加高效。 所以,为了兼顾任意规模数据的排序,一般都会首选时间复杂度是O(nlogn)的排序算法来实现排序函数。 时间复杂度是O(nlogn)的排序算法不止一个,我们已经讲过的有归并排序、快速排序,后面讲堆的时候我们还会讲到堆排序。堆排序和快速排序都有比较多的应用,比如Java语言采用堆排序实现排序函数,C语言使用快速排序实现排序函数。 不知道你有没有发现,

数据结构与算法之美学习笔记:第十五讲

浪子不回头ぞ 提交于 2019-12-05 00:26:19
一、课前问题 今天我们讲一种针对有序数据集合的查找算法:二分查找(Binary Search)算法,也叫折半查找算法。二分查找的思想非常简单,很多非计算机专业的同学很容易就能理解, 但是看似越简单的东西往往越难掌握好,想要灵活应用就更加困难。老规矩,我们还是来看一道思考题。 假设我们有1000万个整数数据,每个数据占8个字节, 如何设计数据结构和算法,快速判断某个整数是否出现在这1000万数据中? 我们希望这个功能不要占用太多的内存空间, 最多不要超过100MB,你会怎么做呢?带着这个问题,让我们进行今天的内容吧! 二、无处不在的二分思想 二分查找是一种非常简单易懂的快速查找算法,生活中到处可见。比如说,我们现在来做一个猜字游戏。我随机写一个0到99之间的数字,然后你来猜我写的是什么。猜的过程中, 你每猜一次,我就会告诉你猜的对了还是错了,直到猜中为止。你来想想, 如何快速猜中我写的数字呢? 假设我写的数字是23,你可以按照下面的步骤来试一试。(如果猜测范围的数字有偶数个,中间数有两个,就选择较小的那个。) 7次就猜出来了,是不是很快?这个例子用的就是二分思想, 按照这个思想,即便我让你猜的是0到999的数字,最多也只要10次就能猜中。不信的话,你可以试一试。 这是一个生活中的例子,我们现在回到实际的开发场景中。 假设有1000条订单数据,已经按照订单金额从小到大排序,

数据结构与算法之美学习笔记:第十三讲

大城市里の小女人 提交于 2019-12-05 00:24:45
一、课前问题 上两节中,我带你着重分析了几种常用排序算法的原理、时间复杂度、空间复杂度、稳定性等。今天,我会讲三种时间复杂度是O(n)的排序算法:桶排序、计数排序、基数排序。 因为这些排序算法的时间复杂度是线性的,所以我们把这类排序算法叫作线性排序(Linear sort)。之所以能做到线性的时间复杂度,主要原因是,这三个算法是非基于比较的排序算法, 都不涉及元素之间的比较操作。 这几种排序算法理解起来都不难,时间、空间复杂度分析起来也很简单,但是对要排序的数据要求很苛刻,所以我们今天 学习重点的是掌握这些排序算法的适用场景 。 按照惯例,我先给你出一道思考题: 如何根据年龄给100万用户排序? 你可能会说,我用上一节课讲的归并、快排就可以搞定啊!是的,它们也可以完成功能,但是时间复杂度最低也是O(nlogn)。有没有更快的排序方法呢?让我们一起进入今天的内容! 二、桶排序(Bucket sort) 1、桶排序的核心思想 首先,我们来看桶排序。桶排序,顾名思义,会用到“桶”,核心思想是将要排序的数据分到一个有序的桶里,每个桶里的数据 再单独进行排序。桶内排完序之后,再把每个桶里的数据按照顺序依次取出,组成的序列就是有序的了。 桶排序的时间复杂度为什么是O(n)呢?我们一块儿来分析一下。 如果要排序的数据有n个,我们把它们均匀地划分到m个桶内,每个桶里就有k=n/m个元素。

算法第四章上机实践报告

久未见 提交于 2019-12-04 23:30:15
一、程序存储问题 1.实践题目 设有n 个程序{1,2,…, n }要存放在长度为L的磁带上。程序i存放在磁带上的长度是 li,1≤i≤n。 程序存储问题要求确定这n 个程序在磁带上的一个存储方案, 使得能够在磁带上存储尽可能多的程序。 对于给定的n个程序存放在磁带上的长度,计算磁带上最多可以存储的程序数。 输入格式: 第一行是2 个正整数,分别表示文件个数n和磁带的长度L。接下来的1行中,有n个正整数,表示程序存放在磁带上的长度。 输出格式: 输出最多可以存储的程序数。 输入样例: 在这里给出一组输入。例如: 6 50 2 3 13 8 80 20 输出样例: 在这里给出相应的输出。例如: 5 2.问题描述 参数:n 表示文件个数;L表示磁带的长度。 输入:第一行 n L ;第二行 n个程序放在磁带上的长度 输出:最多可以存储的程序个数 3.算法描述 1.贪心策略:找尽可能小的程序进行存储,存储尽可能多的程序. 2.运用sort函数把所有程序按大小从小到大进行排序,在背包还有剩余空间的时候,把剩余程序中最小的存入。 3.代码: #include<iostream> #include<algorithm> using namespace std; int n, L; int pgram[1000], clonePgram[1000]; void FindMax(){ int i =

第四次上机报告

£可爱£侵袭症+ 提交于 2019-12-04 23:13:48
2.问题描述:设有n 个程序{1,2,…, n }要存放在长度为L的磁带上。程序i存放在磁带上的长度是 li,1≤i≤n。 程序存储问题要求确定这n 个程序在磁带上的一个存储方案, 使得能够在磁带上存储尽可能多的程序。 对于给定的n个程序存放在磁带上的长度,计算磁带上最多可以存储的程序数。 3.算法描述:运用贪心算法,一直取最小的长度的程序。(先是运用快排函数(sort())进行排序,再从数组开始取最小的程序装入磁带中,直到磁带装不下为止,用数组下标进行计数) 反证法:设a = {a1,a2,...,an}不包含最小长度的程序且它为最优解,b为最小长度的程序。 长度 :a1 > b 所以 b = {b,a2,...,an}也是最优解 b != a 与原题设矛盾。 所以最优解包含最小长度的程序 4.算法时间与空间复杂度的分析 时间复杂度,运用了sort()快排时间复杂度为O(nlog n),装数据和输入数据的算法均为O(n),所以时间复杂度为O(nlog n); 空间复杂度,sort()的空间复杂度为O(1),变量设置的时候运用到一维数组空间复杂度为O(n),所以空间复杂度为O(n); 5.心得体会 题目很难以理解,需要和队友多多学习 来源: https://www.cnblogs.com/szl666666/p/11887442.html

Java排序算法总结(转载)

流过昼夜 提交于 2019-12-04 20:14:29
文件源于 : https://www.cnblogs.com/Jason-Xiang/p/8567751.html 排序算法 平均时间复杂度 冒泡排序 O(n2) 选择排序 O(n2) 插入排序 O(n2) 希尔排序 O(n1.5) 快速排序 O(N*logN) 归并排序 O(N*logN) 堆排序 O(N*logN) 基数排序 O(d(n+r)) 一. 冒泡排序(BubbleSort) 基本思想: 两个数比较大小,较大的数下沉,较小的数冒起来。 过程: 比较相邻的两个数据,如果第二个数小,就交换位置。 从后向前两两比较,一直到比较最前两个数据。最终最小数被交换到起始的位置,这样第一个最小数的位置就排好了。 继续重复上述过程,依次将第2.3...n-1个最小数排好位置。 平均时间复杂度: O(n2) java代码实现: public static void BubbleSort(int [] arr){ int temp;//临时变量 for(int i=0; i<arr.length-1; i++){ //表示趟数,一共arr.length-1次。 for(int j=arr.length-1; j>i; j--){ if(arr[j] < arr[j-1]){ temp = arr[j]; arr[j] = arr[j-1]; arr[j-1] = temp; } } } }

十大经典排序算法(动图演示)(转载)

此生再无相见时 提交于 2019-12-04 19:49:14
0、算法概述 0.1 算法分类 十种常见排序算法可以分为两大类: 比较类排序 :通过比较来决定元素间的相对次序,由于其时间复杂度不能突破O(nlogn),因此也称为非线性时间比较类排序。 非比较类排序 :不通过比较来决定元素间的相对次序,它可以突破基于比较排序的时间下界,以线性时间运行,因此也称为线性时间非比较类排序。 0.2 算法复杂度 0.3 相关概念 稳定 :如果a原本在b前面,而a=b,排序之后a仍然在b的前面。 不稳定 :如果a原本在b的前面,而a=b,排序之后 a 可能会出现在 b 的后面。 时间复杂度 :对排序数据的总的操作次数。反映当n变化时,操作次数呈现什么规律。 空间复杂度: 是指算法在计算机 内执行时所需存储空间的度量,它也是数据规模n的函数。 1、冒泡排序(Bubble Sort) 冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。 1.1 算法描述 比较相邻的元素。如果第一个比第二个大,就交换它们两个; 对每一对相邻元素作同样的工作,从开始第一对到结尾的最后一对,这样在最后的元素应该会是最大的数; 针对所有的元素重复以上的步骤,除了最后一个; 重复步骤1

数据结构与算法| 复杂度分析

夙愿已清 提交于 2019-12-04 19:06:33
是什么:   数据结构指的是“一组数据的存储结构”,算法指的是“操作数据的一组方法”。   数据结构是为算法服务的,算法是要作用在特定的数据结构上的。 为什么要用:   使用合适的数据结构和算法。选用合适的数据结构和算法,特别是在处理体量非常庞大的数据的时候,可以极大提高计算效率。 20 个最常用的、最基础 数据结构与算法:   10 个数据结构:数组、链表、栈、队列、散列表、二叉树、堆、跳表、图、Trie 树;   10 个算法:递归、排序、二分查找、搜索、哈希算法、贪心算法、分治算法、回溯算法、动态规划、字符串匹配算法。 在学习数据结构和算法的过程中, 学习它的“来历”“自身的特点”“适合解决的问题”以及“实际的应用场景”,辩证地思考,多问为什么。 。 效率和资源消耗的度量衡---复杂度分析。 如何分析、统计算法的执行效率和资源消耗?   数据结构和算法本身解决的是“快”和“省”的问题,即如何让代码运行得更快,如何让代码更省存储空间。所以,执行效率是算法一个非常重要的考量指标。 使用 时间、空间复杂度分析 来衡量你编写的算法代码的执行效率。  学习数据结构和算法的基石,就是要学会`复杂度分析`。知道怎么去分析复杂度,才能作出正确的判断,在特定的场景下选用合适的正确的算法。 通过统计、监控,就能得到算法执行的时间和占用的内存大小--(这种叫事后统计法,它有很大局限性)