算法

(算法练习)——贪心

主宰稳场 提交于 2020-01-29 11:42:39
P118 月饼 贪心 主要是记录下结构体中元素的排序 # include <stdio.h> # include <algorithm> using namespace std ; struct mooncake { double store ; double sell ; double price ; } cake [ 1010 ] ; //结构体的排序 bool cmp ( mooncake a , mooncake b ) { return a . price > b . price ; } int main ( ) { int n ; double D ; scanf ( "%d%lf" , & n , & D ) ; for ( int i = 0 ; i < n ; i ++ ) { scanf ( "%lf" , & cake [ i ] . store ) ; } for ( int i = 0 ; i < n ; i ++ ) { scanf ( "%lf" , & cake [ i ] . sell ) ; cake [ i ] . price = cake [ i ] . sell / cake [ i ] . store ; } sort ( cake , cake + n , cmp ) ; double ans = 0 ; for ( int i = 0

23种设计模式

此生再无相见时 提交于 2020-01-29 05:41:07
原文:https://www.cnblogs.com/cainiao-chuanqi/p/10957708.html 1、根据目的分类: 创建模式: 描述“怎样创建对象”,分离对象的创建与使用。如spring的IOC。 共5种:单例、原型、工厂方法、抽象工厂、建造者 结构模式: 描述如何将类或对象按某种布局组成更大的结构。 共7种:代理、适配器、桥接、装饰、外观、享元、组合 行为模式: 描述类或对象之间如何协作共同完成单个对象都无法单独完成的任务,以及怎样分配职责。 共11种:模板方法、策略、命令、职责链、状态、观察者、中介者、迭代器、访问者、备忘录、解释器。 2、根据应用范围分类: 类模式: 静态,编译时刻便确定。 共4种:工厂方法、适配器、模板方法、解释器。 对象模式: 动态,执行时确定。 共21种,除类模式之外的所有 3、解释: 创建型模式: 单例(Singleton)模式:某个类只能生成一个实例,该类提供了一个全局访问点供外部获取该实例,其拓展是有限多例模式。 原型(Prototype)模式:将一个对象作为原型,通过对其进行复制而克隆出多个和原型类似的新实例。 工厂方法(FactoryMethod)模式:定义一个用于创建产品的接口,由子类决定生产什么产品。 抽象工厂(AbstractFactory)模式:提供一个创建产品族的接口,其每个子类可以生产一系列相关的产品。 建造者

机器学习算法集锦:从贝叶斯到深度学习及各自优缺点

前提是你 提交于 2020-01-29 05:16:58
转载自: 机器学习算法集锦:从贝叶斯到深度学习及各自优缺点 在我们日常生活中所用到的推荐系统、智能图片美化应用和聊天机器人等应用中,各种各样的机器学习和数据处理算法正在尽职尽责地发挥自己的功效。本文筛选并简单介绍一些最常见的算法类别,还为每一个类别列出了一些实际算法并简单介绍了它们的优缺点。 相关连接:https://static.coggle.it/diagram/WHeBqDIrJRk-kDDY/t/categories-of-algorithms-non-exhaustive 目录 正则化算法(Regularization Algorithms) 集成算法(Ensemble Algorithms) 决策树算法(Decision Tree Algorithms) 回归(Regression) 人工神经网络(Artificial Neural Network) 深度学习(Deep Learning) 支持向量机(Support Vector Machine) 降维算法(Dimensionality Reduction Algorithms) 聚类算法(Clustering Algorithms) 基于实例的算法(Instance-based Algorithms) 贝叶斯算法(Bayesian Algorithms) 关联规则学习算法(Association Rule

网约车拼车计费算法

倖福魔咒の 提交于 2020-01-29 05:16:35
第一个乘客的计费 : 一共分两种情况 : 第一种 比较简单 ,第一个乘客后下车。 这样的话,第一个乘客的费用减去第二个乘客应付的费用*0.7. 第二个乘客后下车。第一个乘客的全程减去和第二个乘客共同距离费用的0.7 。 拼车主要的耗损在第一个乘客上,所以利益划分主要偏向第一个乘客 来源: CSDN 作者: 胖芸 链接: https://blog.csdn.net/sunchenghu/article/details/103803100

算法:最长有效括号【字符串、动态规划】

佐手、 提交于 2020-01-29 03:35:33
最长有效括号 Category Difficulty Likes Dislikes algorithms Hard (28.90%) 451 - Tags Companies 给定一个只包含 ‘(’ 和 ‘)’ 的字符串,找出最长的包含有效括号的子串的长度。 示例 1: 输入: “(()” 输出: 2 解释: 最长有效括号子串为 “()” 示例 2: 输入: “)()())” 输出: 4 解释: 最长有效括号子串为 “()()” 分析 利用动态规划,构建dp[],dp[i]表示str[0…i]强制以i结尾时的最长有效子串长度。 如果遍历到左括号,直接为0 如果遍历到右括号,需考虑两个值:i-dp[i-1]-1和i-dp[i-1]-2 i-dp[i-1]-1是该右括号要匹配的值,该值必须为左括号,否则有效子串长度为0 i-dp[i-1]-2是该右括号要匹配的值的前一个,有效子串需要加上该位置对应值。 /* * @lc app=leetcode.cn id=32 lang=java * * [32] 最长有效括号 */ // @lc code=start class Solution { public int longestValidParentheses ( String s ) { char [ ] chars = s . toCharArray ( ) ; int [ ] dp

排序算法汇总(二)

心已入冬 提交于 2020-01-29 03:16:20
我们继续接着插入排序法往下聊。 直接插入排序法的时间复杂度问题 插入排序法(或者叫做直接插入排序法)的原理很简单,也很自然,而且也是后面很多排序法的基础,是不得不会的。它的思想是,每一次将待排序的数据插入到已排好顺序的数组中去。所以一开始,任何一个数据都认为是已排好序的。也就是数组的首元素A[0],设数组长度为n,那么第一次插入是从A[1]开始的,先将A[0]赋值给临时变量key.这是一个临时保存待插入数据的新内存空间,防止数据丢失的,而将A[0]赋值给A[1].key与A[0]比较,若大,则将key赋值给A[1],否则将key赋值给A[0].如此就完成了A[1]的插入操作。这是完全可行的。如果现在是A[j] (j<n)要插入,那么一定是A[:j]已经排好序了,而插入A[j]也是要将它赋值给key,将A[j-1]赋值给A[j],相当于数据后移,先后移,再进行比较,若key大,则key赋值给A[j],否则与A[j-1]比较,这里涉及到一个迭代过程,用i标记前j个元素的下标,将j当做一个常数,i递减。只有当i<0或者key大于等于某个A[i] 时循环才会退出。将key的值赋值给A[i+1],操作完成。 最后,由于数组长度时有限的,当k遍历到n时,整个插入排序的算法结束。下面是算法导论中提供的伪码: 插入排序法最坏和平均情况下时间复杂度都是O(n^2),最好情况下时间复杂度为O(n)

常见的加密算法

天大地大妈咪最大 提交于 2020-01-28 23:48:36
常见的加密算法可以分成三类,对称加密算法,非对称加密算法和Hash算法。 对称加密 指加密和解密使用相同密钥的加密算法。对称加密算法的优点在于加解密的高速度和使用长密钥时的难破解性。假设两个用户需要使用对称加密方法加密然后交换数据,则用户最少需要2个密钥并交换使用,如果企业内用户有n个,则整个企业共需要n×(n-1) 个密钥,密钥的生成和分发将成为企业信息部门的恶梦。对称加密算法的安全性取决于加密密钥的保存情况,但要求企业中每一个持有密钥的人都保守秘密是不可能的,他们通常会有意无意的把密钥泄漏出去——如果一个用户使用的密钥被入侵者所获得,入侵者便可以读取该用户密钥加密的所有文档,如果整个企业共用一个加密密钥,那整个企业文档的保密性便无从谈起。 常见的对称加密算法:DES、3DES、DESX、Blowfish、IDEA、RC4、RC5、RC6和AES 非对称加密 指加密和解密使用不同密钥的加密算法,也称为公私钥加密。假设两个用户要加密交换数据,双方交换公钥,使用时一方用对方的公钥加密,另一方即可用自己的私钥解密。如果企业中有n个用户,企业需要生成n对密钥,并分发n个公钥。由于公钥是可以公开的,用户只要保管好自己的私钥即可,因此加密密钥的分发将变得十分简单。同时,由于每个用户的私钥是唯一的,其他用户除了可以可以通过信息发送者的公钥来验证信息的来源是否真实

借助哈希算法实现高效字符串匹配算法

不羁岁月 提交于 2020-01-28 17:35:11
BF 算法,暴力匹配算法,每次往后移一位 RK 算法,通过哈希算法对主串中的 n-m+1 个子串分别求哈希值,然后逐个与模式串的哈希值比较大小。如果某个子串的哈希值与模式串相等,那就说明对应的子串和模式串匹配了(这里先不考虑哈希冲突的问题)。因为哈希值是一个数字,数字之间比较是否相等是非常快速的。 但是需要遍历子串中的每个字符,算法整体的效率并没有提高 提高哈希算法 二十六进制来表示一个字符串:把 a~z 这 26 个字符映射到 0~25 这 26 个数字,a 就表示 0,b 就表示 1; 相邻两个子串的哈希值的计算公式有一定关系 ,可以使用 s[i-1]的哈希值很快的计算出 s[i]的哈希值 26^(m-1) 这部分的计算,我们可以通过查表的方法来提高效率。我们事先计算好 26 0、26 1、26 2……26 (m-1),并且存储在一个长度为 m 的数组中,公式中的“次方”就对应数组的下标。当我们需要计算 26 的 x 次方的时候,就可以从数组的下标为 x 的位置取值,直接使用,省去了计算的时间。 只需要扫描一遍主串O(n),模式串哈希值与每个子串哈希值之间的比较的时间复杂度是 O(1),总共需要比较 n-m+1 个子串的哈希值,整体的 时间复杂度就是 O(n)。 来源: CSDN 作者: lwj~ 链接: https://blog.csdn.net/qq_41754573

排序算法概述

落爺英雄遲暮 提交于 2020-01-28 16:46:46
基本概念 什么是排序 排序是计算机内经常进行的一种操作,将杂乱无章的数据元素,通过一定的方法按关键字顺序排列的过程叫做排序。 什么是稳定性 定义 能保证两个相等的数,经过排序之后,其在序列的前后位置顺序不变。(A1=A2,排序前A1在A2前面,排序后A1还在A2前面)。 意义 稳定性本质是维持具有相同属性的数据的插入顺序 ,如果后面需要使用该插入顺序排序,则稳定性排序可以避免这次排序。 排序分类 内部排序和外部排序 按照是否要访问外存,排序可以分为内部排序和外部排序。 内部排序(In-place) 若整个排序过程不需要访问外存便能完成,则称此类排序问题为内部排序。 外部排序(Out-place) 若参加排序的记录数量很大,整个序列的排序过程不可能在内存中完成,则称此类排序问题为外部排序。 稳定排序和不稳定排序 按照稳定性,排序可以分为稳定排序和不稳定排序。 稳定排序 假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的。 不稳定排序 假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序可能会发生变化,即在原序列中,r[i]=r[j],且r[i]在r[j]之前

NP问题

吃可爱长大的小学妹 提交于 2020-01-28 14:12:49
希望通过这篇文章可以不仅让计算机相关专业的人可以看懂和区分什么是P类问题什么是NP类问题,更希望达到的效果是非专业人士比如学文科的朋友也可以有一定程度的理解。 有一则程序员界的笑话,就是有一哥们去google面试的时候被问到一个问题是:在什么情况下P=NP,然后他的回答是”当N=1的时候”。这是我第一次听说P=NP问题,大概是在临近毕业为找工作而准备的时候。 这几天科技类新闻的头条都被阿尔法狗大战李世石刷爆了,虽然我也不是AI专家,但是也想从普通人的角度来写点东西来聊聊这个有意思的事情,在搜集资料的时候又一次看到了NP问题,于是想开个小差,先说说这个NP问题。 P类问题最简单的定义是这样的: P问题:一个问题可以在多项式(O(n^k))的时间复杂度内解决。 NP问题:一个问题的解可以在多项式的时间内被验证。 NP-hard问题:任意np问题都可以在多项式时间内归约为该问题,但该问题本身不一定是NP问题。归约的意思是为了解决问题A,先将问题A归约为另一个问题B,解决问题B同时也间接解决了问题A。 NPC问题:既是NP问题,也是NP-hard问题。 这样的定义虽然简单,但是对于第一次接触P、NP的人来说,就像前一阵问你什么是“引力波”而你回答:引力波是时空的涟漪。从答案中几乎没有得到任何有意义的理解。所以接来来的内容希望不仅计算机相关专业的人可以看懂