datetimepicker 多次点击input日期选择器不显示

首先熟悉一下datepicker的部分属性设置以及详细解释: //js中的datepicker属性设置 $('.selectData').datepicker({ autoclose: true, //自动关闭 beforeShowDay: $.noop, //在显示日期之前调用的函数 calendarWeeks: false, //是否显示今年是第几周 clearBtn: false, //显示清除按钮 daysOfWeekDisabled: [], //星期几不可选 endDate: Infinity, //日历结束日期 forceParse: true, //是否强制转换不符合格式的字符串 format: 'yyyy-mm-dd', //日期格式 keyboardNavigation: true, //是否显示箭头导航 language: 'cn', //语言 minViewMode: 0, orientation: "auto", //方向 rtl: false, startDate: -Infinity, //日历开始日期 startView: 0, //开始显示 todayBtn: false, //今天按钮 todayHighlight: false, //今天高亮 weekStart: 0 //星期几是开始 }); 这两天遇到datetimepicker中多次(包括第二次点击)点击input框时日期选择器不显示,经过查阅和多次测试,需要使用鼠标监听触发,具体方法如下: /* 点击input框时加载监听事件*/ document.getElementsByName('input的name名称')[0].addEventListener('click',myfunc) function myfunc(e){ e.currentTarget.blur(); } 以上这段代码必须放在datetimepicker方法的后面,希望大家可以借鉴或者有更好的方法提出,大家共享一下。

JSTL标签if和choose

------------------------------- JSTL标签if和choose---------------------------- if和choose(重点) if标签的test属性必须是一个boolean类型的值,如果test的值为true,那么执行if标签的内容,否则不执行。 <c:set var="a" value="hello"/> <c:if test="${not empty a }"> <c:out value="${a }"/> </c:if> choose标签对应Java中的if/else if/else结构 when标签的test为true时,会执行这个when的内容。 当所有when标签的test都为false时,才会执行otherwise标签的内容 <c:set var="score" value="${param.score }"/> <c:choose> <c:when test="${score > 100 || score < 0}">错误的分数:${score }</c:when> <c:when test="${score >= 90 }">A级</c:when> <c:when test="${score >= 80 }">B级</c:when> <c:when test="${score >= 70 }">C级</c:when> <c:when test="${score >= 60 }">D级</c:when> <c:otherwise>E级</c:otherwise> </c:choose> <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <%@page import="com.rl.model.*" %> <!DOCTYPE html PUBLIC "

JSTL标签概述和out和set标签的用法

----------------------------------------- JSTL标签概述和out和set标签的用法---------------------------------------------- JSTL 1 JSTL概述 什么是JSTL JSP 标准标记库(JSP Standard Tag Library,JSTL)是一个实现 Web 应用程序中常见的通用功能的定制标记库集,这些功能包括迭代和条件判断、数据管理格式化、XML 操作以及数据库访问。既然是第三方的东西,那么就需要导包。但是如果你使用的是MyEclipse,那么MyEclipse会帮你导包的。 2 导入标签库 导入标签库需要使用taglib指令! <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/fmt" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/functions" %> 这东西不用去背,可以把光标放到uri属性位置上,使用Alt+/来查看uri列表,找到其中包含jstl,并且包含core的就是了。 使用JSLT需要导入两个包: 下载参考地址http://www.runoob.com/jsp/jsp-jstl.html 2 JSTL核心库 1 out和set(重点) out <c:out value=”aaa”/> 输出aaa字符串常量 <c:out value=”${aaa}”/> 与${aaa}相同 <c:out value=”${aaa}” default=”xxx”/> 当${aaa}不存在时,输出xxx字符串 <% request.setAttribute("a","<script>alert('hello');</script>"); %> <c:out value="${a }" default="xxx" escapeXml="false" /> 当escapeXml为false,不会转换“<”、“>”。这可能会受到JavaScript攻击。 set:set标签的var、value、scope是一组,而target、property、value是一组。 <c:set var=”a” value=”hello”/> 在pageContext中添加name为a,value为hello的数据。 <c:set var=”a” value=”hello” scope=”session”/>

vue报错 Uncaught ReferenceError: exports is not defined

最近发现vue报这个错,上网查了一些资料,发现在webpack 2后不允许混合使用import和module.exports 1.解决办法 统一改成ES6的方式 export default XXX; 2.解决办法 找到.babelrcf删除transform-runtime

python3:Tkinter——简单的窗口视窗

编程环境:pycharm、python 3.6 Tkinter 是 tk 的 python 接口,使用 python 进行窗口视窗的设计。其操作非常的简单易懂,对于和我一样的初学者来说,是入门之选。 本博文包括Label、Button、Entry、Text、Listbox、Radiobutton、Scale、Checkbutton、Canvas、Manubar、Frame、Messagebox、pack grid place的使用。 窗口主题框架 一个Tkinter主体框架可以包含下面几个部分: 定义 window 窗口并设置 window的一些属性编写窗口内容执行window.mainloop() import tkinter as tk #导入tkinter模块 window = tk.Tk() #主窗口 window.title('my window') #窗口标题 window.geometry('200x100') #窗口尺寸 ### 这里是窗口的内容### window.mainloop() #循环消息,让窗口活起来 窗口控件 下面对窗口内容可包括的一些控件操作进行简单的介绍: tk.Label 标签 l = tk.Label(window, text='OMG! this is TK!', # 标签的文字 bg='green', # 背景颜色 font=('Arial', 12), # 字体和字体大小 width=15, height=2 # 标签长宽 ) l.pack() # 固定窗口位置 如果我们需要通过变量的形式控制Label的显示,那么需要用到var变量,如下: var = tk.StringVar() # 文字变量储存器 var.

win 10 读写EFI分区

写在前面: 从零用U盘安装win 10 之后,EFI分区往往只有100MB,如果要在一个SSD下分区安装黑苹果,就需要扩大EFI分区到200MB。这时候我们可以选择的工具有Diskgenius 傲梅硬盘分区助手等。两款软件我都使用过,都可以进行。Diskgenius 需要用到PE版本的。 进入PE之后,将win保留分区删除,进而扩大EFI分区。如果刚装完win10 系统就操作的话,应该会很快。原理就是按照硬盘的扇区将数据移动。这时候一定要保证不能突然断电。如果突然断电硬盘里的数据就会损毁。笔记本有电池,不怕这个。台式机的话可以配一个UPS不间断电源。 我们安装双系统时,有时候需要手动读取EFI分区,改变EFI分区里的文件等等。可以用diskgenius 软件帮我们进行操作。我们也可以用win10 自带的硬盘操纵工具进行。 (1)首先 以管理员权限打开cmd (2)输入diskpart 进入磁盘操作指令 (3)list disk 查看所有硬盘的情况 (4)sel disk number 选择相应的要进行操作的硬盘 (5)list par 列出该硬盘所有的分区 (6)sel list number 选择相应的分区 (7)set id="ebd0a0a2-b9e5-4433-87c0-68b6b72699c7" # 设置为基本数据分区 (8)assign letter =x # 挂载到x盘符 然后exit 退出 打开notepad 点击文件打开,即可访问EFI分区 注意:win10 系统做了限制,不能从我的电脑里面进行打开。 如果要恢复EFI分区 那么重复之前的步骤,然后set id=C12A7328-F81F-11D2-BA4B-00A0C93EC93B 则恢复到了EFI分区

异常处理和序列化----c#

前言:这次和大家分享的是两个非常重要的知识点,一个是异常处理,另一个是序列化。学习异常处理可以帮助我们的代码更加的规范,同时可以避免客户使用我们开发的软件的时候,突然出现异常而引起的恐慌。学习序列化可以帮助我们更加轻松的应用代码做出我们想做出的东西。两个知识点都是非常实用和方便的。 (一)异常处理 1.异常处理的理论 2.异常处理的实践 (二)序列化 1.序列化的理论 (1)设计模式: 模式:得到很好研究的范例 设计模式:①软件开发过程中经验的积累②特定问题经过实践检验的特定解决方法 (2)序列化步骤: //创建流 //创建序列化器 //记性序列化 //序列化的时候 要有标记 [Serializable ] 序列化bf.Serialize(fs ,p ); 反序列化p = (Person)bf.Deserialize(fs); using System.Runtime.Serialization.Formatters.Binary 好处:把不同类型的数值,通过反序列化直接提取,不用转换。 所有的属性都可以通过代码的方式,改变属性值 2.序列化的实践 (三)虚方法和静态方法 1.虚方法与重写 ①方法布恩那个用static修饰 ②方法重写与基类的签名必须一直 ③virtual不能与private一起使用 2.静态方法和实例方法 总结:每一次总结,都是一次复习和回顾。在总结中不断的收获成长。

解决Xshell 工具连接不上VirtualBox虚拟机

初次尝试用VirtualBox安装Linux虚拟机,却遇到了一些问题,特地记录于此,方便后面查阅! 首先简易记录下安装Linux虚拟机过程: 大致经过如下步骤:新建虚拟电脑,加载Linux版本镜像安装文件,安装结束配置网络连接; 1:新建虚拟电脑: 利用VirtualBox的新建虚拟电脑向导还是很容易新建一台虚拟电脑的,一路下一步就可以了。 2:点击上图创建后,然后启动虚拟机: 注意此处:宿主机CPU需要支持虚拟化技术:如下图所示: BIOS 中设置如下: 设置好后重启,打开VirtualBox进一步设置: 3:按向导指引安装,安装过程中提示设置Root用户密码: 4:安装完成,重启虚拟机: 5:设置虚拟机可以上网:此时ping www.baidu.com 会无反应。设置如下:(下图是VirtualBox的 全局设定,不是某个虚拟机的网络设置) 在虚拟机窗口中输入:cd /etc/sysconfig/network-scripts/ 编辑 ifcfg-enp0s3文件 vi ifcfg-enp0s3 (按Tab键自动补充完成),设置onboot=yes; esc + :wq 保存修改退出 编辑模式 使用vi进入文本后,按i开始编辑文本 退出编辑模式 按ESC键,然后: 退出vi :q! 不保存文件,强制退出vi命令 :w 保存文件,不退出vi命令 :wq 保存文件,退出vi命令 此时可以ping通 Internet网络,但主机无法通过xshell工具连接到虚拟机!下面来解决这个问题: 确保关闭虚拟机,启用下图中的网卡2: 即为虚拟机设置两张网卡: 网卡1设置为网络地址转换(NAT),实现虚拟机通过主机网络访问互联网;网卡2设置为host-only;实现主机与虚拟机互联,重启虚拟机; 输入ifconfig 查看网络网卡信息:由于我们的安装包是最小化CentOS,默认没有安装ifconfig命令,先升级下系统: yum update; 再 yum search ifconfig, 搜索ifconfig命令所在的安装包: 再执行yum install net-tools.x86_64 此时执行ifconfig得到如下信息: 那么虚拟机的IP就是192.168.56.3,这里56网段是VirtualBox的默认HostOnly网段。 主机CMD命令行里ping 192.168.56.3 可以ping通了!问题解决,完成!

需求背后程序员的辛酸—(由APP主题颜色随手机壳颜色变化需求带来的思考)

说说最近发生的一些事情 近日 某互联网公司就因为 '主题颜色随手机壳颜色变化'而发生了一次吵架事件,后来都被开除了! 作为一名程序员,大家都知道,产品经理是需要经常与研发人员打交道的一个职业,他们也有一定的技术常识,有相当一部分产品经理都曾经是程序员,他们也开发过很多优秀的产品,后来由于自己的职业规划就转产品经理了,因此这部分人与程序员沟通起来也是相当轻松的,当然也有一部分产品经理直接就是从产品经理做起,没有一定的技术基础,他们设计出的产品更多从用户角度出发,不会过多的去考虑技术实现的问题,最近就有这么一个互联网公司的产品经理提出了一个牛逼的需求,把程序员们难倒了! 后来看谷歌最近也出了这么一个设计,如图6所示,我估计产品经理应该要的是这种效果,另外查资料得知坚果手机,一加手机,还有三星s8都有这个功能,虽然并没什么卵用! 发生这种情况,也是我们不希望看到的。作为一个程序员,我知道,根据我之前开发过的相似的功能特征,我可以估计出现在的这些功能特征各自要多少开发时间。然后,我把总时间加起来,这就得到了完成整个项目需要的大致时间。然而,事实情况中,每个项目在开发过程中都遇到二、三个瓶颈。这些瓶颈会肆意的消耗程序员的大量时间,你在遇到它们之前根本不会有所预见。它们会拖住整个项目,致使工期延后数周甚至数月。 这些是没有经验的人在评估复杂度时不会理解的。他们不明白在其他事情上都很灵的方法,为什么放到软件开发上就不灵了。所以,下一次当你听到有人说“我想你几天时间就能把它开发出来”时,不管是谁说的,都不要懊恼。深呼吸一下,告诉他这篇文章的地址,《不懂技术的人不要对懂技术的人说这很容易实现》自己该干什么还干什么。 对于产品来说 产品提出的需求,一定要是经过需求评审会的,符合实际的一些场景的。 往往一些看似很简单的需求,实际上会遇到很多坑。 提需求要有节奏感。不要误会,这个节奏感不是啪啪啪的节奏感,而是说你提的需求,要跟着项目的版本周期和实际应用场景走。 需求的来源 老板提出的战略方向的需求:老板会站在战略层的事务,在确定了产品的方向之后,他会对产品的样子有个大致的想象,有些功能是必须要有的,这时候,他会和大家讨论哪些需求建议加上去。 一、谈需求前,先明确问题是什么 问题”不是“我要一个…功能”,而是“我在做…时,为了达到…的目的,需要通过产品完成”。 二、说需求时,先别讨论解决方案 三、聊需求后,明确边界和优先级 学会拒绝不合理需求,学会正确沟通需求,这是作为一个产品经理最基本的责任; 就像阿伟大佬说的那样,一定要开需求评审会,拿出原型图,设计图,或者一些参考资料,让大家讨论一下,尽量提让大家接受范围之内的合理的需求。不要盲目给开发者开一些脑洞大开的自以为是的“神创意”!也许你无意中的一句话就被打了还不知道怎么回事。 对于程序开发者来说 1、开发人员有质疑这个需求不合理不合理的建议 (这里切记不要说这是xxx的需求,我也认为不合理,但是没有办法,这样只会让开发人员鄙视你,造成你后续的被动,工作越来越难开展) 2、开发人员在实现需求的过程要考虑其复杂程度,如果实现起来比较麻烦,也可以和产品经理进行商讨 (产品经理和开发人员是承上启下的关系,也是完成一个需求功能不可缺少的一部分,正确的沟通和理解会让你在以后的工作中得心应手) 在工作中我也会跟开发、UI等相关人员进行激烈的沟通和争吵,但是都是基于工作需求;任何一个需求的确认如果只是平平淡淡,没有一点问题和摩擦肯定会出现问题,只有大家一起沟通确认才能让需求正确的执行。 最后 最后忍不住吐个槽。有些产品经理动不动就拉老大来给程序员施压,我觉得这种是最low的。 总之我个人认为需求的确认需要大家一起来确认,不是老板的责任,不是某一个部门的责任,不是某一个角色的责任;要适当的学会拒绝,学会沟通,才能让需求更正确的执行。 开发者很辛苦,希望可以谅解一下。 ###阅读更多 终于,我还是下决心学Java后台了 来谈一下android中的MVVM 金9银10的面试黄金季节,分享几个重要的面试题 身为程序员写一百万行代码的感觉 相信自己,没有做不到的,只有想不到的 在这里获得的不仅仅是技术!

org.springframework.beans.factory.CannotLoadBeanClassException: Cannot find class

启动eclipse项目报 说找不到某类,但是实际情况是有的。 org.springframework.beans.factory.CannotLoadBeanClassException: Cannot find class [com.xm.hrs.cmd.UuidGenerator] for bean with name 'uuidGenerator' defined in URL [jar:file:/D:/XM_Project/XM_HRM/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/xmhrs-manager/WEB-INF/lib/xmhrs-core-0.0.1-SNAPSHOT.jar!/spring-activiti.xml]; nested exception is java.lang.ClassNotFoundException: com.xm.hrs.cmd.UuidGenerator 原因是,tomcat配置是选择自带的jdk,导致的。部署项目默认自带的jdk,先将自己配置的tomcat删除,重新配置 然后选一下自己的jdk版本,部署就好了、

iOS 11.2 - 11.3.1 越狱教程

iOS 11.2 - 11.3.1 越狱教程 文章目录 iOS 11.2 - 11.3.1 越狱教程一、准备相应的工具二、删除 11.4 OTA 更新包三、安装 tvOS 描述文件屏蔽更新四、打开 Electra 开始越狱五、解决 Cydia 不能上网的问题 一、准备相应的工具 (1) 下载 CydiaImpactor,官网地址是 http://cydiaImpactor.com (2) 下载 Electra,官网地址是 https://coolstar.org/electra/, 有两个版本,笔者测试下载的是 Uses vfs exploit 的版本。 (3) 使用 CydiaImpactor 安装下载好的 Electra ipa 包,当然也可以使用其他重签名工具进行安装。 在这里需要注意的是 Electra 官网提示以下信息: Important: Make sure to delete 11.4 OTA update, install tvOS profile and reboot before using Electra! 也就是说在使用之前要确认是否删除 11.4 的更新包,并且安装 tvOS profile 屏蔽更新。 二、删除 11.4 OTA 更新包 打开设置 -> iPhone 储存空间,会看到 11.

TP5运行workerman的操作

1-安装workerman 首先通过 composer 安装 composer require topthink/think-worker -vvv 如果报错: Installation failed, reverting ./composer.json to its original cont 则使用 composer require topthink/think-worker=1.0.* -vvv 如果需要在window下做服务端,还需要 composer require workerman/workerman-for-win -vvv 2-在thinkphp5根目录(即与application同级目录)创建server.php,编辑一下内容。 server.php 文件内容 define('APP_PATH', __DIR__ . '/application/'); define('BIND_MODULE','push/Worker'); // 加载框架引导文件 require __DIR__ . '/thinkphp/start.php'; 3-新建模块和控制器 创建workerman的controller,命名为Worker.php。在application/push/controller,目录不存在自行创建。添加以下内容: 4-Worker.php。文件的内容 <?php namespace app\push\controller; use think\worker\Server; class Worker extends Server { protected $socket = 'websocket://127.0.0.1:2346'; /** * 收到信息 * @param $connection * @param $data */ public function onMessage($connection, $data) { $connection->send('我收到你的信息了'); } /** * 当连接建立时触发的回调函数 * @param $connection */ public function onConnect($connection) { } /** * 当连接断开时触发的回调函数 * @param $connection */ public function onClose($connection) { } /** * 当客户端的连接上发生错误时触发 * @param $connection * @param $code * @param $msg */ public function onError($connection, $code, $msg) { echo "

【神经网络】用python从底层实现一个卷积神经网络

1. 背景介绍:卷积神经网络(CNN) 卷积神经网络(ConvolutionalNeural Network,CNN)是人工神经网络的一种。当前已经成为图像和语音识别领域有十分广泛的应用,特别是在识别位移、缩放及其他形式扭曲不变性的二维图形方面有十分优异的表现,已经成为一个十分重要的研究方向。 关于CNN的详细解释可以看这篇论文1。 接下来我将实现一个卷积神经网络,用来识别CIFAR-10数据集中的图片,我会给出每一层的前向和后向推导,以及python底层实现,如有什么错误,欢迎指出。 2. 矩阵知识 矩阵部分知识可以参考一文搞定BP神经网络——从原理到应用(原理篇) 3.网络框架 这个是我们所要搭建的网络,这里讲卷积,池化,激活层,flatten层,全连接层,softmax层都看做独立的层来分析。 因为神经网络的批处理和权重共享特点,这里我设置训练网络是输入每个batch=10的幅图片。这10张图片正向传播时是数据互不干扰的,反向传播时数据共同加和作用残差传递。所以我们可以以单幅图像为参考理解整个网络,在反向传播涉及批处理时我会提出。 如图所示,我只列出了一幅图像的RGB3个通道作为输入,图像像素大小是32*32,所以输入层是[10 3 32 32]的python-list格式。 4.从数据处理开始讲起 如果你翻阅我的博客,你会发现,我是从7月19日写的“在Windows10下安装anaconda”,之后陆陆续续更新了十几篇文章,而这十几篇文章源于一个目的:从0编写一个底层的CNN网络并可视化每层的map特征。为什么要做这个事,一方面是项目要求,另一方面是我从去年开始入门深度学习,陆陆续续看了几十篇深度学习方面的文献,跑了十几个文献开源代码,当我开始有了新的思路想要仿照着别人的代码实现自己的深度学习网络时,却怎么也不得法门。所以我需要从原理层面和代码层面从头推导一边。 我的底层CNN代码时基于python3+和numpy的,所以你可以在Ubuntu【推荐】或者Windows系统上安装anaconda,然后创建一个python3+的环境。 数据是CIRAF-10,数据的读取请看【cifar-10】:数据读取代码中出现ImportError: cannot import name ‘imread’当然,为什么会写一个报错博客,是因为CIFAR-10数据python提取代码需要安装依赖。 下面是数据去均值,请看我之前博客:【数据预处理】:图像去均值:image mean 和 pixel mean 5.正向传播 正向传播有卷积,池化,激活,全连接等,这里我们按照在网络框架的出场顺序依次介绍,注意这里我把每个网络层的正向传播与反向传播写到一篇博客里了,所有,在看正向传播的时候可以将反向传播部分跳过: 正向传播第一站:【Python实现卷积神经网络】:卷积层的正向传播与反向传播+python实现代码 正向传播第二站:【Python实现卷积神经网络】:池化层的正向传播与反向传播+python实现代码 正向传播第三站:【Python实现卷积神经网络】:激活层RELU的正向与反向传播+python实现代码 正向传播第四站:【Python实现卷积神经网络】:全连接层的正向传播与反向传播+python实现代码 正向传播第五站:【Python实现卷积神经网络】:神经网络的Loss函数:Softmax+Cross Entropy前向传播原理+python实现代码 6.反向传播 反向传播是从softmax开始的,所以,我们先要了解softmax的传播原理,然后从softmax开始反向传播。由于反向传播是倒着传播的,所以我们按照网络框架的反向顺序开始讲解: 反向传播第一站是:【交叉熵】:神经网络的Loss函数编写:Softmax+Cross Entropy 反向传播第二站是:【反向传播】:从softmax层开始反向传播 反向传播第三站是:【反向传播】:全连接层的正向传播与反向传播 反向传播第四站是:【反向传播】:激活层RELU的正向与反向传播 反向传播第五站是:【反向传播】:池化层的正向传播与反向传播 反向传播第六站是:【反向传播】:卷积层的正向传播与反向传播 下边儿是我在组织本博客时的想法,不构成主要内容。 我的博客特点:其它人讲每层的原理的时候只是单幅图像来介绍公式原理,但是应用到代码时是batch处理的,所以前向传播,反向传播,矩阵的加减,求导等和单幅图像不一样。我讲每层原理时,先从简单的一幅图像开始,然后公式均扩展到batch=10的数组上边处理。这样,你再写代码时就会理解它的代码为什么这样写了。 每层主要讲几部分 1.该层作用 2.数学原理及正反向公式 3.批处理公式 4.在公式落实到代码时的步骤 5.在代码中如何将层写成函数 训练网络代码 在我的github中,分步代码讲解在前向传播反向传播讲解的时候附上,总的代码在我的github上边儿 待更新: 1.增加loss下降可视化:https://blog.csdn.net/sinat_28113749/article/details/79079832 2. 会随着我的想法的更新和新的网络的出现而增加。。。 测试网络代码 。。。 。。。统一的残差更新公式【这里我们先分层计算残差公式,然后最后总结推导出 这个统一的残差公式】 【未完待续】 参考:23 https://www.cnblogs.com/charlotte77/p/7783261.html https://www.cnblogs.com/pinard/p/6494810.html http://yann.lecun.com/exdb/publis/pdf/lecun-98.pdf ↩https://blog.

一种快速的自适应二值化算法-wallner

wallner算法原理简述: 我们用P(n)来表示第n个点的灰度值. T(n)来表示二值化后的值。用f­ s (n) 来表示第n个点之前s个点的灰度值的和,就是 用这个s和另一个变量t就可以简单的说明P(n)应该是0还是1了, 这个公式就是 根据经验值来看, 这里的s和t最佳的取值范围是s= image.width/8, 而t=15的时候效果最好.且1为黑(背景),0为白(前景)) 但是有个问题,现在定义T(n)的时候,用的是平均值,也就是说之前扫描过的若干点对于当前点的影响或者说权重是一样的。 所以这里改进成离当前点越近的像素对当前点的影响越大,越远则越小。用g(n)代替T(n)。公式如下: 还有一个问题存在, 就是现在的颜色计算依赖于我的扫描顺序,(一般都是水平扫描的). 这样的话, 我的像素值实际上取决于我水平位置上的邻接点的灰度值, 可是竖直方向的像素如何关联起来呢? 这里也有一个说明, 我们可以维护前面依次水平扫描产生的g_prev(n)序列, 在某个g(n)被使用之前, 我们可以让他和前一个g_prev(n)取一个平均值, 这样的话, 这个最终的值就更有说服力了. 另外由于需要给定一个初始的迭代值,这里取g(n) = 127 *s,127是灰度0~255的中间值 代码实现: #include<opencv2\opencv.hpp> #include<iostream> using namespace std; using namespace cv; void wallner(Mat & src, Mat & dst) { /* * pn = 当前点的灰度值 * s = 图片宽度/n (n = 8时效果最好) * t = 比例阈值 * 公式:g(n) = g(n-1) * (1-1/s) + p(n) */ int t = 15; int s = src.

纯JS打造多选下拉框select+模糊查询功能

多选下拉框功能,html本身就提供,multiple就可以了。但是这个multiple有个缺点,那就是高度和宽度是固定的,无法改变,很占用页面空间。 下面两张图,右边的是html原生的multiple,左边的是纯js完成的。 左图:缺点是麻烦,优点是节约页面空间,且附带模糊查询功能。 右图:缺点是浪费空间,优点是简单。 当然,现在很多前端框架都包含了左图的功能,简单易用。之所以会用纯js完成左图的功能,是因为同事负责的一个项目,框架很老,而且大公司对系统框架控制比较严格,不能引用新的前端框架,所以才用纯js写的。 代码不多,很简单,必要的注释都有,相信都能看得懂。有什么疑问的话可以留言哈,一起讨论。 <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ANSI"> <title>Insert title here</title> </head> <body> <div style="width:200px;height:20px;overflow:hidden;"> <input type="text" id="selectButton" onclick="myclick();" readonly="true" style="width:200px;height:20px;"> </div> <div id="fuzzysearchdiv" style="display:none;width:200px;z-index:3;position:absolute;height:20px;" onMouseOver="mousein()" onMouseOut="mouseout()"> <input type="text" id="fuzzysearch" onkeyup="myfuzzysearch()" style="width:185px;"/> </div> <div id="selectdiv" style="display:none;border:1px solid #A9A9A9;width:200px;z-index:2;position:absolute;overflow-y :scroll;height:100px;background-color:white;" onMouseOver="mousein()" onMouseOut="mouseout()"> <br> </div> <br> <input type="button" value="提交" onclick="mysubmit();"/> </body> <script type="text/javascript"> //下拉框的数据,股票代码/股票名称 var initlist = ['3001/股票1','3002/股票2','3003/股票3','3004/很长的很长的股票4','3005/最长最长最长最长最长最长的股票5','3006/test6','3007/一号#7','3008/最后一个股票-'];// //多选下拉框所在的div var selecteddiv = document.getElementById("selectdiv"); //鼠标是否在【多选下拉框div】上面(如果在div上面,需要控制鼠标的点击事件,不让div隐藏;否则要让该div隐藏) var indiv = false; //模糊查询input var fuzzysearchinput = document.

打包Maven项目时出现Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:testCompile

【导致原因】:这个是jdk版本导致的,就例如我的问题就是,我环境是jdk1.8,但是eclipse如果你不指定在build时的jdk版本默认是jdk1.7,从而导致报错Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.1:testCompile 【解决方法】: 在你的maven项目中的pom.xml文件添加如下配置(如何已经存在如下配置应作对应修改,把jdk版本改为自己电脑环境中的版本) 【配置代码】: <build> <plugins> <!-- 设置编译版本为1.8 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.8</source> <target>1.8</target> <encoding>UTF-8</encoding> </configuration> </plugin> </plugins> </build>ild>

Merge Sort及应用

算法原理 定义merge_sort函数,将数组分为两部分A[left..mid]和A[mid+1..right],分别对这两部分排序(递归调用merge_sort函数),然后调用merge函数合并这两部分 void merge_sort( vector<int>& A, int left, int right ) { // 如果left == right,说明数组只包含1个元素,不必排序,直接返回 if( left >= right ) // 似乎left == right也没问题 return; int mid = left + ( right - left ) / 2; merge_sort( A, left, mid ); // 递归调用 merge_sort( A, mid + 1, right ); // 递归调用 merge( A, left, mid, right ); } 定义merge函数,将排好序的两部分A[left..mid]和A[mid+1..right]合并起来 void merge( vector<int>& A, int left, int mid, int right ) { // 复制A[left.

知识是系统的

计算机研究生面试准备 知识要成体系是非常重要, 这篇文章单纯的收集了许多知识, 但是我不能保证我掌握了这些知识 为什么高引知乎,因为人们选择在知乎发文章的时候力求解惑,所以他们更会为读者考虑,而其他博客难免会形式化于自己知识的总结,记录的时候会更符合自己的认知习惯 操作系统 文件系统和数据库系统的区别,哪个效率更高,为什么? [数据库系统与文件系统的区别 CSDN][为什么需要数据库?知乎]进程上下文切换具体过程,是什么实现的?[进程、线程和上下文切换]BIOS的意思[BIOS 百度百科] 程序的可移植性操作系统的基本概念[操作系统—基本概念]操作系统开机过程[操作系统启动过程 百度百科][操作系统启动过程 CSDN]操作系统分哪些部分,进程管理包含什么内容?[操作系统的体系结构][操作系统:进程管理(概念)]操作系统我们所学的其他课程有什么关系,还是操作系统是个独立的课程?[为什么要学操作系统?]什么是系统调用?它和库函数调用有什么区别?[linux系统调用和库函数调用的区别] 计算机网络 数据链路层是干什么的,输入数据在网络层叫什么,网络模型,网络层协议有哪些,应用层协议有哪些[深入浅出-网络七层模型&&网络数据包]分组的生命期,为什么要设置这个生命期dns的工作过程[DNS原理及其解析过程【精彩剖析】]点击一个链接的网络过程[在浏览器地址栏输入一个URL后回车,背后会进行哪些技术步骤?]两台计算机中的进程进行通信,需要解决什么问题?[进程通信] 基础数学 什么是极限,什么是趋近?极值的求法泰勒级数的展开式;为什么把一个简单的函数表示成那么麻烦的泰勒级数?[如何通俗地解释泰勒公式?知乎]傅立叶级数[傅里叶级数和傅里叶变换是什么关系?知乎]信息和数据的区别?[信息和数据有什么区别?知乎]图形和图像有什么区别?1概率的全概率公式[条件概率,全概率,贝叶斯公式理解]现代秩的概念,线性相关与无关,矩阵的用途[如何直观理解矩阵和线性代数? 知乎] 3b1b的视频 [数学家最初发明行列式和矩阵是为了解决什么问题?]什么是图的同构?数理逻辑的定义离散数学包含哪些部分?[离散数学讲些什么内容?在计算机科学有什么应用?该怎么学好?]集合的势,无限集合的大小比较,偏序,良序,全序,划分,欧拉图,Hamilton图什么是群谓词逻辑和命题逻辑的区别什么是等价关系,什么是子句,什么是合取范式什么是二元关系 接下来都是坑 参考 北航计算机复试面试题

PHP--会员账号单唯一登录

情景再现 同一会员账号限制在同一台设备(电脑、手机、Ipad等)上单点登录,重复登录后,原登录访问页面时则直接跳转到登录页面且需要重新登录才能正常访问。 原理分析 A账号在A电脑上登录后,A账号此时又用B电脑再次登录,则A电脑请求页面时,提示“重新登录”的信息,并跳转到登录页面 思路解析: A账号在A电脑上登录后,把SESSION ID写入TXT文件,每次访问页面时,都做一次校验(比较txt文件的值是否和当前登录的session_id的值相同) 实例 1、入口与校验(index.php) <?php session_start(); $uid = 10; if(is_login($uid)){ header('location:loginSuccess.php'); }else{ $getLogSessionId = file_get_contents('session_log/'.$uid.'.txt'); if($getLogSessionId){ echo "已在其他地方登录,请重新登录"; echo "<br>"; echo "5秒后跳转到登录页面!"; header("refresh:5;url=login.php"); }else{ echo '第一次登录...'; echo "<br>"; echo "3秒钟后跳转到登录页面!"; header("refresh:3;url=login.php"); } } /** * 通过登录时写入文件session_id和当前登录设备后生成的session_id进行比较,相同则是同一台设备登录,不同则在别的地方登录 */ function is_login($uid){ $getLogSessionId = file_get_contents('session_log/'.$uid.'.txt'); if($getLogSessionId == session_id()){ return true; }else{ return false; } } 2、登录(login.php) <?php session_start(); echo "登录中...."; echo '<br>'; $uid = 10; file_put_contents('session_log/'.$uid.'.txt',session_id()); echo "

NVIDIA Jetson TX2:TX2平台介绍

一:TX2平台概述 TX2是快速高效的嵌入式AI计算设备。低功耗(标准)模式(7.5w);高功耗模式(15w),性能是TX1的两倍。具有多种标准的硬件接口,使其易于集成到广泛的产品形式中去。目的在于加强终端计算能力,推广人工智能终端化,而不依赖于网络环境。 应用场景:智慧城市与安防;深度摄像机;智能云结构化服务器安防;超市无人售卖机;vSLAM;智能机器人等 System Layout 二:硬件平台 为了方便地让用户配置CPU状态,以最大限度地提高不同场景下的性能和能耗,TX2 拥有6个CPU核心和一个GPU组成。 CPU集群由双核Denver2处理器和四核ARM Cortex-A57组成,通过高性能互连架构连接。GPU由两个Pascal 架构的SM组成。下表列出了CPU内核的5种模式。 TX2默认模式只开4个ARM A57 CPU,即mode1模式(Max-Q) 三:软件平台 Ubuntu 16.04 出厂自带 Ubuntu 16.04 系统,可以直接启动。 JetPack 3.2.1 更新到最新的 JetPack L4T(俗称刷机),并自动安装最新的驱动、CUDA Toolkit、cuDNN、TensorRT等。 刷机教程放在另外一篇博客。

ajax中请求之后的回调函数function(response,status,xhr)

function(response,status,xhr) 规定当请求完成时运行的函数。 额外的参数: response - 包含来自请求的结果数据status - 包含请求的状态("success", "notmodified", "error", "timeout" 或 "parsererror")xhr - 包含 XMLHttpRequest 对象

jQuery解析XML数据(jQuery调用JSON数据学习第六天)

与传统的JavaScript调用XML数据相比,使用jQuery框架解析XML数据将方便很多,通常情况下,在jQuery框架中,先使用$.ajax()方法请求并打开指定的XML文件,然后,在回调函数中获取返回的XML文件数据对象,使用find(),children(),text()方法获取各标签下的元素并读取元素的值。 (1)功能描述 在页面中,用户单击“获取数据”按钮时,将回调用jQuery框架中的$.ajax()方法打开指定的XML文件,然后通过遍历的方式将读取的数据显示在页面中。 (2)实现代码 功能代码: <script src="JScript/jquery-1.8.2.min.js" type="text/javascript"></script> <style type="text/css"> body{font-size:13px} .iframe{width:260px;border:solid 1px #666} .iframe .title{padding:5px;background-color:#eee} .iframe .content{padding:8px;font-size:12px} .btn {border:#666 1px solid;padding:2px;width:80px; filter:progid:DXImageTransform.Microsoft .Gradient(GradientType=0,StartColorStr=#ffffff, EndColorStr=#ECE9D8);} </style> <script type="text/javascript"> $(function(){ $("#Button1").Click(function() { //按钮单击事件 var strHTML = ""; //初始化保存内容变量 $.ajax({ url:'Xml/7-5.xml', dataType:'xml', success:function(data) { var $strUser = $(data).find("User"); strHTML += "编号:" + $strUser.attr("id") + "<br>"; strHTML += "姓名:" + $strUser.attr("name") + "<br>"; strHTML += "性别:" + $strUser.attr("sex") + "<br>"; strHTML += "

spring boot中jackson时间格式和东八区的设置

为什么80%的码农都做不了架构师?>>> application.properties # JACKSON (JacksonProperties) spring.jackson.date-format=yyyy-MM-dd HH:mm:ss spring.jackson.time-zone=GMT+8 第一个设置就是使用24小时的时间格式;第二个设置就是设置时区为东八区。 bean @JsonFormat private Date modifyDate; 然后,在你想要格式化的属性上面使用@JsonFormat注解。 后续 如果使用了extends WebMvcConfigurationSupport方式配置,如果想要使用上面的方式配置时间格式,需要将extends WebMvcConfigurationSupport替换为implements WebMvcConfigurer。 参考 Appendix A. Common application properties Custom WebMvcConfiguration breaks Jackson formatting 转载于:https://my.oschina.net/fxtxz2/blog/1861776

编程计算二叉树中某结点的层数

题目:编写一个函数:实现在二叉树中查找与字符key内容相同的结点,并返回其在二叉树中的层数。如果二叉树中不存在该结点,则返回-1. #include "stdio.h" typedef struct BiTNode{ char data; /*结点的数据域*/ struct BiTNode *lchild , *rchild; /*指向左孩子和右孩子*/ } BiTNode , *BiTree; /*创建一棵二叉树*/ void CreatBiTree(BiTree *T){ char c; scanf("%c",&c); if(c == ' ') *T = NULL; else{ *T = (BiTNode * )malloc(sizeof(BiTNode)); /*创建根结点*/ (*T)->data = c; /*向根结点中输入数据*/ CreatBiTree(&((*T)->lchild)); /*递归地创建左子树*/ CreatBiTree(&((*T)->rchild)); /*递归地创建右子树*/ } } int getNodelayer (BiTree T,int level,char key) { int l; if(T) { if(T->data == key) { return level; /*找到与key值相同的结点,将层数level返回*/ } l = getNodelayer (T->lchild,level+1,key); /*在左子树中查找key结点,并得到其层数*/

python3:出错!this inspection detects names that should resolve but don't.due to dynamic dispatch and d

初学爬虫,就遇到一个特别傻的错误,搞了大半个小时,终于知道问题所在了。 this inspection detects names that should resolve but don't.due to dynamic dispatch and duck typing,this is possible in a limited but useful number of cases .top-level and class-level items are supported better than instance items 错误意思为:import的类urllib不在python库中。 .py代码如下: from urllib import request ''' 使用urllib.request请求一个网页内容,并把内容打印出来 ''' if __name__ == '__main__': url = "https://blog.csdn.net" # 打开相应url并把相应页面作为返回 rsp = request.urlopen(url) # 把返回结果读取出来,读取出来内容类型为bytes html = rsp.read() print(type(html)) # 如果想把bytes内容转换成字符串,需要解码 html = html.decode("utf-8") print(html) 是因为使用pycharm,配置的python解释器出现了问题。如下:

从零开始的程序逆向之路 第一章——认识OD(Ollydbg)以及常用汇编扫盲

作者:Crazyman_Army 原文来自:https://bbs.ichunqiu.com/thread-43041-1-1.html 0×00 序言: 1.自从上次笔者调戏完盗取文件密码大黑客后,这激发了笔者的创作热情,就给大家带来程序逆向系列,当然有一些地方还是有所欠缺,请大家在私聊中指出我文中的错误,我会加以改正。 2.本篇教程每篇文章都会在附件中给出一个程序逆向例子,所用到的知识都会在该篇文章中体现,有兴趣的同学可以自己实践实践 3.为什么要学习逆向破解? a.你可以汉化一些软件给予大家使用 b.你可以进行病毒分析 c.外挂辅助的研究 d.程序的破解 4.这套系列笔者所用的工具已经被笔者整理为工具包,链接地址: https://bbs.ichunqiu.com/thread-43019-1-1.html 5.破解的环境要求由于一些程序的编写者不期望自己的程序被破解(其实谁也不期望),所以就采取了一些比较极端的方法,比如:格式化您的重要资料 …… 所以,程序破解的时候需要用到虚拟机,虚拟机推荐使用vmware 下载链接: https://pan.baidu.com/s/19eBzCzPrSs4xnkwrcWNV_Q 密码: 9954 虚拟机安装教程: https://jingyan.baidu.com/article/25648fc1c467eb9191fd00d6.html 系统镜像下载地址: https://msdn.itellyou.cn/ 只需要把您需要用到的镜像的下载链接放到迅雷里即可 —————————————————————————————————————————————————————————————————— 0×01首先认识一下OD(Ollydbg) 打开OD界面,呈现出下图的窗口分布,这里笔者对OD界面的几个窗口进行了一下标识。 1.菜单窗口: 从左往右依次去说这些按钮的作用以及快捷键: (1) 打开新的可执行文件[快捷键F3] (2) 重新载入程序[快捷键Ctrl+F2] (3) 关闭程序 [快捷键Alt+F2] (4) 运行程序[快捷键F9] (5) 暂停执行程序 [快捷键F12] (6) 单步步入[快捷键F7] (7) 单步步过[快捷键F8] (8) 跟踪步入[快捷键Ctrl+F11] (9) 跟踪步过[快捷键Ctrl+F12] (10) 执行到返回[快捷键Ctrl+F9] (11) 转到反汇编窗中口的地址(转到表达式)[快捷键Ctrl+G] (12) 显示记录窗口[快捷键Alt+L] (13) 显示模块窗口[快捷键Alt+E] (14) 显示内存窗口[快捷键Alt+M] (15) 显示线程窗口 (16) 显示窗口 (17) 显示句柄窗口 (18) 显示CPU窗口[快捷键Alt+C] (19) 显示补丁窗口[快捷键Ctrl+P]

基于layui2和thinkphp5项目开发心得记录(一)

写这系列的文章目的无他,仅仅是用以记录自己写项目的一些思路和心得,在开发过程中代码是以实现为首要目的,写得并不会非常美观实用,代码会在后期不断调试更改,文章也会进行不定期更新。未经作者允许请勿转载。 最新更新:2018/7/26 功能需求:选取页面表格信息,批量生成word文件 相关技术点 前端layui表格的数据显示与后台json接口页面与页面之间的参数传递,页面与后台之间的参数传递php批量生成word文件(数组循环遍历、字符串与数组转化、js中window.location.search的用法和作用。)html样式对word影响浏览器文件下载 首先是用一个layui表格对数据进行展示,html页面写个table标签,给个id <table class="layui-table" id="projtb" lay-filter="filtertb"></table> 按照layui框架的规则,在JS中对表格的表头值进行规定,field是与数据库对应的字段值,title是表格的表头 layui.use('table', function(){ var table = layui.table; //表格列表 var show_col=[[ {type:'checkbox', fixed: 'left'} ,{field:'id',width:85, sort: 'true', title: 'ID',style:"font-size:10px;"} ,{field:'name',width:180, sort: 'true', title: '名称',style:"font-size:12px"} ,{field:'desc', width:180, sort: 'true' , title: '备注',style:"font-size:12px"} ,{field:'is_on_duty' ,width:140,sort: 'true', title: '是否管理',style:"font-size:12px"} ,{field:'status', width:94, sort: 'true' , title: '状态',style:"font-size:12px"} ,{fixed:'right', width:114, align:'center', toolbar: '#op-bar' , title: '操作',style:"font-size:12px"} ]]; //表格属性 var options={ elem: '#projtb' ,height: 315 ,url: ' ' //数据接口 ,page: true //开启分页 ,cols: show_col } //渲染 table.

明明apple id 密码 是对的,登陆 iTunes还总提示密码错误

明明apple id 密码 是对的,登陆 iTunes还总提示密码错误 ?? 不是网络问题 不是服务器问题 是需要双重验证,需要把其他设备上提示的验证码,和密码一起输入进 密码框 例如 密码是 123abc , 验证码是 890 那么在iTunes密码框 要输入 123abc890 才能验证通过

Realtime Multi-Person 2D Pose Estimation Using Part Affinity Fields【菜鸟读者】

Realtime Multi-Person 2D Pose Estimation Using Part Affinity Fields Realtime Multi-Person 2D Pose Estimation Using Part Affinity Fields 1.文章概要2.文章亮点3.姿势识别流程4.网络详解 4.1 网络收敛性判断4.2 计算S∗j(p)Sj∗(p)S^*_j(p)4.3 计算L∗c(p)Lc∗(p)L^*_c(p)4.4 如何评估评估两点相连的可能性 5. 关节拼接 5.1 拼接方法尝试5.2 拼接过程 1.文章概要 文章实现了图片中的多人姿态检测,与已有的方法相比,最大的优势在于检测的速度对人物的数量不敏感,在保持检测精度的情况下大幅提升了速度。 怎样快速的理解本文的内容,我尝试着讲下面一个故事: 有一张照片上有很多人在摆pose,老师正要给小朋友们讲这些人都在摆什么姿势。突然,一个叫VGG19的熊孩子把照片给撕得七零八碎。为了恢复出照片上的姿势信息,于是老师找来一些好朋友帮忙。 首先来帮忙的是分别叫CNN_S和CNN_L的两个闺蜜。CNN_S负责从碎片中把身体关节部位(头、肩、胳膊肘等)识别出来,并且按照关节部位将所有人的同一关节点坐标记录一个热图中。CNN_L擅长识别肢体部分(大臂、小臂…),同样,她也要把所有的人同一肢体记录到一张图像中。需要提醒的是:CNN_L只是判断出碎片里是否有肢体,无法判断肢体两端是胳膊肘还是膝盖, 下面的任务就是如何把肢体两端的关节点连接起来,并且最终拼接成人骨架结构,以表示当前人的姿势。 这个任务就交给了帕森(Parsing)大叔,大叔先拿了两张位置相连的关节热图(例如肩膀和胳膊肘的热图),根据CNN_L提供的肢体图,找到两张热图中最可能的关节对应关系。这个关节点的连线就带表了一个肢体。然后大叔重复按照此方法把身体的其他肢体都逐一找到,最后把这些找到的肢体按照位置关系进行拼接,就实现了图中所有人物姿势的还原。 好了,故事结束,希望这个故事能够对文章的理解产生一点帮助。下面介绍一下本文的亮点。 2.文章亮点 目前,已经有了许多关于检测的工作。许多的检测方式都是先想办法检测出身体的部位的关节点,然后再连接这些部位点得到人的姿态骨架。 本文的工作差不多也是这个套路,但是为了快速的把点连到一起,提出了Part Affinity Fields这个概念来实现快速的关节点连接。 上图展示了文章进行多人姿态检测的效果,下栏的子图展示了文章的亮点–Part Affinity Fields(部分亲和字段<求更好的翻译>)。Part Affinity Fields的关键作用就是可以实现一段躯干(limb)两端(part)的快速匹配。 个人理解: Part Affinity Fields就是一个向量,该向量代表了身体的一段躯干(如白花花的大腿…) 好了,文章的亮点介绍完了,下面介绍文章的主要内容。我认为,这篇文章主要工作就是要用CNN在图片中检测两个东东: 1. Part(关节点 或 身体部位) — Part Confidence Maps 例子:头、肩膀、胳膊肘….. 2. Part Affinity(肢体段)检测 — Par Affinity Fields 例子:大臂(不包含肩膀和胳膊肘)

animate.css在vue项目中的使用

在vue项目中使用动画其实有多种方式,可以使用vue中的过渡transition,可以使用animate动画与transition配合使用,也可以单独使用animate动画库(详情可见vue官网-过渡:过渡),下面我们开始介绍在vue中单独使用animate动画,其实也非常简单,两步就可以实现: 第一步:安装: 在命令行中执行:npm install animate.css --save 第二步:引入及使用: main.js中: import animated from 'animate.css' // npm install animate.css --save安装,在引入 Vue.use(animated) 使用: vue模板中: <div class="ty"> <!-- 直接使用animated中的动画class名,注意:必须使用animated这个class名,否则动画会无效 --> <div class="box animated bounceInDown"></div> </div> (如果要自定义动画可以配合vue的过渡使用)

详细及易读懂的 大津法(OTSU)原理 和 比opencv自带更快的算法实现

OTSU算法原理简述: 最大类间方差是由日本学者大津(Nobuyuki Otsu)于1979年提出,是一种自适应的阈值确定方法。算法假设图像像素能够根据阈值,被分成背景[background]和目标[objects]两部分。然后,计算该最佳阈值来区分这两类像素,使得两类像素区分度最大。 公式: 记 M = 256 单通道灰度分级 Sum = 像素总数 背景像素占比 前景像素占比背景的平均灰度值前景的平均灰度值0~M灰度区间的灰度累计值类间方差:将公式3.4.5带入公式6 可得最终简化公式: 3、4的意思:每个灰度(0~255)比例 * 当前灰度的和。 代码: #include <opencv2\opencv.hpp> #include <iostream> #include <time.h> using namespace std; using namespace cv; int myOtsu(Mat & src, Mat &dst) { int th = 0; const int GrayScale = 256; //单通道图像总灰度256级 int pixCount[GrayScale] = { 0 };//每个灰度值所占像素个数 int pixSum = src.cols * src.rows;//图像总像素点 float pixPro[GrayScale] = { 0 };//每个灰度值所占总像素比例 float SumpixPro[GrayScale] = { 0 }; // 比例的和 float WpixPro[GrayScale] = { 0 }; //比例 * 权重 float SumWpixPro[GrayScale] = { 0 };//比例 * 权重 的 和 float w0, w1, u0tmp, u1tmp, u0, u1, deltaTmp, deltaMax = 0; double start = getTickCount(); //开始时间 for (int i = 0; i < src.

Eureka 虽然闭源了,但注册中心还有更多选择:Consul 使用详解

在上个月我们知道 Eureka 2.0 闭源了,但其实对国内的用户影响甚小,一方面国内大都使用的是 Eureka 1.X 系列,另一方面 Spring Cloud 支持很多服务发现的软件,Eureka 只是其中之一,下面是 Spring Cloud 支持的服务发现软件以及特性对比: FeatureeuerkaConsulzookeeperetcd服务健康检查可配支持服务状态,内存,硬盘等(弱)长连接,keepalive连接心跳多数据中心—支持——kv 存储服务—支持支持支持一致性—raftpaxosraftcapapcacpcp使用接口(多语言能力)http(sidecar)支持 http 和 dns客户端http/grpcwatch 支持支持 long polling/大部分增量全量/支持long polling支持支持 long polling自身监控metricsmetrics—metrics安全—acl /httpsaclhttps 支持(弱)spring cloud 集成已支持已支持已支持已支持 在以上服务发现的软件中,Euerka 和 Consul 使用最为广泛。如果大家对注册中心的概念和 Euerka 不太了解的话, 可以参考我前期的文章:springcloud(二):注册中心Eureka ,本篇文章主要给大家介绍 Spring Cloud Consul 的使用。 Consul 介绍 Consul 是 HashiCorp 公司推出的开源工具,用于实现分布式系统的服务发现与配置。与其他分布式服务注册与发现的方案,Consul 的方案更“一站式”,内置了服务注册与发现框 架、分布一致性协议实现、健康检查、Key/Value 存储、多数据中心方案,不再需要依赖其他工具(比如 ZooKeeper 等)。使用起来也较 为简单。Consul 使用 Go 语言编写,因此具有天然可移植性(支持Linux、windows和Mac OS X);安装包仅包含一个可执行文件,方便部署,与 Docker 等轻量级容器可无缝配合。 Consul 的优势: 使用 Raft 算法来保证一致性, 比复杂的 Paxos 算法更直接. 相比较而言, zookeeper 采用的是 Paxos, 而 etcd 使用的则是 Raft。

Leetcode——分割等和

题目描述:给定一个只包含正整数的非空数组。是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。 解题思路: 可以看成一个背包大小为 sum/2 的 0-1 背包问题。 class Solution { public boolean canPartition(int[] nums) { int sum = sum(nums); if(sum%2!=0) return false; int w = sum / 2; boolean dp[] = new boolean[w+1]; dp[0] = true; for(int num:nums){ for(int j = w;j>=num;j--) dp[j] = dp[j]||dp[j-num]; } return dp[w]; } public int sum(int[] nums){ int sum = 0; for(int x:nums) sum += x; return sum; } } 拓展——改变一组数的正负号使得它们的和为一给定数 题目描述:给定一个非负整数数组,a1, a2, .

python 繁体字与简体字互相转换

一、新建文件:langconv.py from copy import deepcopy import re try: import psyco psyco.full() except: pass try: from zh_wiki import zh2Hant, zh2Hans except ImportError: from zhtools.zh_wiki import zh2Hant, zh2Hans import sys py3k = sys.version_info >= (3, 0, 0) if py3k: UEMPTY = '' else: _zh2Hant, _zh2Hans = {}, {} for old, new in ((zh2Hant, _zh2Hant), (zh2Hans, _zh2Hans)): for k, v in old.items(): new[k.decode('utf8')] = v.decode('utf8') zh2Hant = _zh2Hant zh2Hans = _zh2Hans UEMPTY = ''.

使用JetbrainsCrack-2.6.10-release-enc.jar文件注册激活idea

1.下载JetbrainsCrack-2.6.10-release-enc.jar文件,资源可以在网上找 2.在C:IDEA\bin目录下找到idea.exe.vmoptions,idea64.exe.vmoptions两个文件并使用notepad打开 3.添加JetbrainsCrack-2.6.10-release-enc.jar文件路径 打开idea,进入Help-Register打来后将以下代码复制到Activation code里面,用户名和邮箱可以改成你自己的用户名和邮箱 ThisCrackLicenseId-{ "licenseId":"ThisCrackLicenseId", "licenseeName":"用户名", "assigneeName":"", "assigneeEmail":"一个邮箱地址", "licenseRestriction":"For This Crack, Only Test! Please support genuine!!!", "checkConcurrentUse":false, "products":[ {"code":"II","paidUpTo":"2099-12-31"}, {"code":"DM","paidUpTo":"2099-12-31"}, {"code":"AC","paidUpTo":"2099-12-31"}, {"code":"RS0","paidUpTo":"2099-12-31"}, {"code":"WS","paidUpTo":"2099-12-31"}, {"code":"DPN","paidUpTo":"2099-12-31"}, {"code":"RC","paidUpTo":"2099-12-31"}, {"code":"PS","paidUpTo":"2099-12-31"}, {"code":"DC","paidUpTo":"2099-12-31"}, {"code":"RM","paidUpTo":"2099-12-31"}, {"code":"CL","paidUpTo":"2099-12-31"}, {"code":"PC","paidUpTo":"2099-12-31"} ], "hash":"2911276/0", "gracePeriodDays":7, "autoProlongated":false} 点击OK注册完成!

Java死锁的原因例子及解决方法

Java发生死锁的根本原因是:在申请锁时发生了交叉闭环申请。即线程在获得了锁A并且没有释放的情况下去申请锁B,这时,另一个线程已经获得了锁B,在释放锁B之前又要先获得锁A,因此闭环发生,陷入死锁循环。 死锁发生的例子1: public class DeadLockA extends Thread { @Override public void run() { try{ System.out.println("LockA running"); while(true){ synchronized(Client.obj1){ System.out.println("LockA locked obj1"); //获取obj1后先等一会儿,让LockB有足够的时间锁住obj2 Thread.sleep(100); System.out.println("LockA trying to lock obj2..."); synchronized(Client.obj2){ System.out.println("LockA locked obj2"); } } } }catch(Exception e){ e.printStackTrace(); } } } public class DeadLockB extends Thread { @Override public void run() { try{ System.out.println("LockB running"); while(true){ synchronized(Client.obj2){ System.out.println("LockB locked obj2"); System.out.println("LockB trying to lock obj1..."); synchronized(Client.obj1){ System.out.println("LockB locked obj1"); } } } }catch(Exception e){ e.

台式电脑怎么使用iPhone热点进行上网

网上找了很多文章,都说的很简单 1、点击手机的设置,开启数据流量,然后点击个人热点; 2、通过USB数据线将苹果手机和ITunes连接; 3、打开电脑的网络和共享中心,更改适配器设置; 4、右击默认的网络连接,点击属性; 5、点击勾选“允许其他网络用户通过此计算机的Internet连接来连接“; 6、点击对话框的设置,勾选”Web服务器“和”安全Web服务器“就可以了. https://jingyan.baidu.com/article/86112f138e571a2736978768.html 经测试 ,网络中心就是检测不到手机的网络啊!!! 后来一想: 我电脑没有装iTunes 。。。。。。。。。。 安装完iTunes确定了 信任 之后,成功检测到网络,拔掉网线,成功使用手机4G网上了网,啦啦啦。 话说4G网比网线稳定多了..

WPF- 模拟触发Touch Events

基于API: [DllImport("User32.dll")] public static extern bool InitializeTouchInjection(uint maxCount = 256, TouchFeedback feedbackMode = TouchFeedback.DEFAULT); [DllImport("User32.dll")] public static extern bool InjectTouchInput(int count, [MarshalAs(UnmanagedType.LPArray), In] PointerTouchInfo[] contacts); 实现效果:点击按钮,自动触发TouchDown事件、获取TouchEventArgs参数得到坐标,创建Line并设置X1、Y1属性,紧接着触发TouchMove、TouchUp事件,得到TouchUp的TouchEventArgs设置Line的X2、Y2属性。 private void MainWindow_TouchUp(object sender, TouchEventArgs e) { System.Windows.Input.TouchPoint oPos = e.GetTouchPoint(this); this.ProxyLine.X2 = oPos.Position.X; this.ProxyLine.Y2 = oPos.Position.Y; this.GdRootZm.Children.Add(this.ProxyLine); Console.WriteLine("TouchID " + e.TouchDevice.Id + " TouchUp " + oPos.Position.X + " " + oPos.Position.Y); } private void MainWindow_TouchMove(object sender, TouchEventArgs e) { System.Windows.Input.TouchPoint oPos = e.

Android获取已安装应用信息(图标,名称,版本号,包)

一、程序大概分成三个部分: 1.获取手机已安装的所有应用package的信息(其中包括用户自己安装的,还有系统自带的); 2.滤除系统自带应用; 3.通过列表显示出应用程序的图标(icon),和其他文字信息(应用名称,包名称package name,版本号等等) 二、首先,我们定义一个数据结构,来保存应用程序信息(icon,name,packageName,versionName,versionCode,等) [java] public class AppInfo { public String appName=""; public String packageName=""; public String versionName=""; public int versionCode=0; public Drawable appIcon=null; public void print() { Log.v("app","Name:"+appName+" Package:"+packageName); Log.v("app","Name:"+appName+" versionName:"+versionName); Log.v("app","Name:"+appName+" versionCode:"+versionCode); } } 三、然后我们通过PackageManager 来获取已安装的应用包信息。 [java] ArrayList<AppInfo> appList = new ArrayList<AppInfo>(); //用来存储获取的应用信息数据 List<PackageInfo> packages = getPackageManager().getInstalledPackages(0); for(int i=0;i<packages.size();i++) { PackageInfo packageInfo = packages.get(i); AppInfo tmpInfo = new AppInfo(); tmpInfo.appName = packageInfo.applicationInfo.loadLabel(getPackageManager()).toString(); tmpInfo.packageName = packageInfo.packageName; tmpInfo.

unity out_Log

unity2017.2开始 log文件的位置不再是Data文件夹,而是默认在用户文件夹里,细节可以看这个页面https://docs.unity3d.com/2017.2/Documentation/Manual/LogFiles.html如果需要自定义位置,可以用命令行 -logFile <pathname>

在 Android Studio 添加一个activity并实现跳转

Android Studio比较人性化,当你添加一个activity时,他会自动把相关信息写入AndroidManifest.xml文件中,同时添加activity的布局文件到资源res->layout下面。 我这里随便取个名称,叫TextViewActivity。这时layout下面自动创建的这个文件叫做activity_text_view.xml,就是TextViewActivity所对应的layout。 顺便说一句,根据创建activity的命名不同,自动创建的文件名可能各不相同。我是用refactor根据自己的喜好修改了文件名(改成了TestTextViewAcitivity)。使用refactor的好处就是,程序会自动查找文件的所有引用,并在相应的地方加以修改。如果你不在意文件名,大可不用理会这些。 为了演示activity之间的跳转结果,先完成一个布局文件,如下 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <TextView android:id="@+id/ttv1" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="@string/tt_string" android:textColor="#5500FF" android:textSize="32sp" android:padding="10dp" /> <TextView android:id="@+id/ttv2" android:layout_width="355dp" android:layout_height="wrap_content" android:maxLines="1" android:ellipsize="end" android:padding="10dp" android:text="what are you going to do" android:textColor="#00FF55" android:textSize="32sp" /> <TextView android:id="@+id/ttv3" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="More Info" android:drawableRight="@drawable/arrow_down" android:textSize="32sp" android:padding="10dp" /> </LinearLayout> 源码中给不同文字添加了些效果,预览时的显示效果是这样的, 接下来我们处理TestTextViewActivity这个文件,先给出源码 package com.spacesoftwares.myapplication2; import android.graphics.Paint; import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.widget.TextView; public class TestTextViewActivity extends AppCompatActivity { private TextView mtv1; @Override protected void onCreate(Bundle savedInstanceState) { super.

python3.7版本下,安装wxpython

目前支持python的所谓“GUI工具包”(GUI Toolkit)有很多,但是没有一个被认为标准的GUI工具包。而wxpython是最熟悉的跨平台python GUI工具包。 1、wxpython安装 安装网址:https://pypi.org/project/wxPython/ 注意!!一定要看清楚你安装的python版本和所选的wxpython版本。 (1)查看自己安装的python版本。 我下的是python3.7,win64,如下: (2)进入安装网站后,选择符合的wxpython版本进行下载。 我选择wxPython-4.0.3-cp37-cp37m-win_amd64.whl 其中,文件命名规则请参考以下引用文字: File naming conventions: Files with the “*.whl” extension are binary wheel files (https://wheel.readthedocs.org/en/latest/). See below for more info. Files with the “*.tar.gz” extension are compressed tar archives of the Phoenix and wxWidgets source code. The “-docs-.tar.gz” files are compressed archives of the documentation. For example: wxPython_Phoenix-3.0.3.dev1549+fa6f31f-cp33-cp33m-macosx_10_6_intel.whl means: - This is the wxPython_Phoenix package - It is version 3.0.3.dev1549+fa6f31f (a development version, with the build number derived from the source control system.

《算法导论》之线性规划(1)关于标准型和松弛型的理解

一般线性规划 一个线性规划问题是一个线性函数最小化或最大化的问题,该线性函数服从一组有限个线性约束。如果要最小化,则称此线性规划为最小化线性规划;如果要最大化,则称为最大化线性规划。 已知一组实数a1,a2,…,an和一组变量x1,x2,…,xn。给出定义在这些变量上的线性函数f: 首先,考虑两个变量的线性规划: 最大化 : x1+x2 满足约束 : 所有满足上述约束式的变量x1和x2的取值为线性规划的一个可行解。 按照以前的学习来理解,我们可以画出关于上述不等式的坐标图,如下: 我们将可行解的集合(图中的阴影部分)称为可行区域。在这个可行区域中,存在最大化解,那么希望最大化的函数称为 目标函数。从概念上来说,我们可以对区域中任何一个点求值,这个值称为目标值。那么我们从图中可以找出一个有最大目标值的点作为最优解。 对于上面这个例子,当x1=2,x2=6 时,取得最优解,且目标值为8。 标准型和松弛型 在标准型中,我们已知n个实数c1,c2,…,cn;m个实数b1,b2,…,bm,以及mn个实数aij,其中i=1,2,…,n。我们希望找到n个实数x1,x2,…,xn, 最大化: 满足约束条件: 因此,称 为目标函数,不等式(1)和(2)中的m+n个不等式为约束。其中(2)中的n个约束为非负约束。 注意 :一个任意的线性规划不必有非负约束,但是标准型需要。 转换线性规划为标准型 已知一个线性函数满足若干线性约束,要求最小化或最大化它,我们总可以将这个线性规划转化成标准型。一个线性规划可能有如下四个原因不是标准型: (1)目标函数可能是最小化而不是最大化。 (2)可能有变量不具有非负约束。 (3)可能有等式约束,即有一个等号而不是一个小于等于号。 (4)可能是不等式约束,但不是小于等于号,而是一个大于等于号。 当然,从一个线性规划转化成另外一个线性规划,两者应当是等价的。 何为等价? 对两个最大化线性规划L和L’,如果对L每个目标值为z的可行解,都存在一个对应的L’的目标值为z的可行解,且对L’的每个目标值为z的可行解,都存在一个对应的L的目标值为z的可行解,则称L和L’是等价的。 解决方案: 针对(1)两边取负即可 针对(2)假设某个变量xj不具有非负约束。那么将xj用xj’-xj”代替,并增加非负约束xj’≥0,xj”≥0。若目标函数有项为cjxj,将其替换为cjxj’-cjxj”。如果约束i有aijxj,则替换为aijxj’-aijxj”。经过此操作后,新的线性规划的任意可行解与原先可行解之间的关系为,且转换前后目标值不改变! 针对(3)非常简单,假设有等式f(x1,x2,…,xn)=b,用f(x1,x2,…,xn)≤b和f(x1,x2,…,xn)≥b来代替。 针对(4)两边取负。 下面看一个例子,(1)~(3)分别为上述存在的问题,(4)是改过后的标准型。 转换线性规划为松弛型 我们将其转换成只有非负约束是不等式约束,其他约束均是等式约束的形式。 设是一个不等式约束,我们引入新变量s,并重写不等式为两个约束我们称s是一个松弛变量,其度量了左右之间的松弛程度。 当从标准型转化为松弛型时,使用Xn+i来表示与第i个不等式相关的松弛变量。因此,第i个约束是,非负约束Xn+i≥0。 例如,对上述标准型引入松弛变量x4,x5,x6后,得到 在上述线性规划中,除了非负约束之外,所以约束都是等式约束,且每个变量都满足非负约束。我们也会使用z来表示目标函数。得到松弛型 和标准型一样,松弛型的符号更为简洁。 以上就是我对线性规划中标准型和松弛型的理解及整理,有不当望指出哈。

Windows与Linux之间互传文件的方法

以下方法均是以Windows为操作机: 1. 通过WinSCP: WinSCP是一款开源的SFTP客户端,运行于Windows系统下,遵照GPL发布。WinSCP除了SFTP,还支持SSH、SCP(SecureCopy Protocol)。WinSCP的开发始于2000年4月,由布拉格经济大学所发展与维护,基于PuTTY的SSH实现,支持SSH1、SSH2。 操作步骤如下: (1). 从官网https://winscp.net/eng/download.php 下载最新稳定版本5.13.3安装; (2). 首次登入需要新建站点,文件协议默认选择为SFTP,主机名填写Linux ip,端口号默认为22,用户名填写登入Linux系统的用户名,密码为Linux主机密码,然后点击保存,后面再次登入就无需重复填写,如下图所示: (3). 然后点击登入即可,登入后的界面如下,即可在Windows和Linux之间互拖文件: 2. 通过Xshell: Xshell是一个强大的安全终端模拟软件,它支持SSH1、SSH2以及Windows的TELNET协议。它可以在Windows下用来访问远端不同系统下的服务器,从而比较好的达到远程控制终端的目的。 操作步骤如下: (1). 从官网https://www.netsarang.com/download/下载最新稳定免费版本Xshell 6安装,首次下载需要填些信息即可; (2). 打开后,点击文件----> 新建:弹出对话框,”名称”可以随便写;”协议”默认选择SSH即可;”主机”填写Linux ip;”端口号”默认填写22即可,如下图: (3). 点击用户身份验证:”用户名”填写登入Linux系统的用户名,”密码”为Linux主机密码,如下图,点击确定后对话框会关闭,会将信息保存; (4). 然后再次点击文件----> 打开:选中刚才保存的会话,然后点击连接,弹出对话框,输入Linux主机密码即可,如下图: (5). 通过输入”rz”命令,实现由Windows向Linux传送文件,好像仅支持传输单个文件,如下图: (6). 通过输入”sz 文件名”,实现由Linux向Windows传送文件,如下图: 3. 通过scp命令,将Windows上文件传到Linux上,如下图:

浏览器报错:err_connection_refused

1、打开浏览器,点设置按钮; 2、点击右上角internet选项命令; 3、在Internet选项对话框中,选择”高级“选项卡 4、在”高级“页面中,选择”重置浏览器“删除个人设置。 5、重新启动浏览器

OpenCasCade入门tutorial

Tutorial简述gp_XXXStandard_XXXGeom_XXXGC_MakeXXXTopoDS_XXXBRepBuilderAPI_XXXBRepPrimAPI_XXXBRepFilletAPI_XXXTopExp_ExplorerTopAbs_ShapeEnumBRepAlgoAPI_XXXBRep_Tool与 Standard_TransientTopTools_XXXBRepOffsetAPI_XXXTutorial源代码 OCC接触两年有余了,以前使用频率不高,好多东西一知半解,现在是需要用到它的时候了。 Tutorial简述 Tutorial用一个绘制Bottle的例子描述了OCC建模的基本步骤。这里涉及了一些概念和类的用法,不细心看做笔记是很容易忘掉的。 gp_XXX gp_Pnt 是最简单的“点”;此外对应的有还有许多这样的简单结构,这些类从其类名就可以知道它可能有哪些参数,没错,这些类包含了点、线、面、轴以及各种曲面等,其中的参数都是构建这些几何结构必须的参数,我们可以称gp_Pnt这一类的类为基本几何类。 —————————————————————————————— - gp_Ax2 - gp_Ax2d - gp_Ax3 - gp_Ax3d - gp_Ax22 - gp_Ax22d - gp_Circ - gp_Circ2d - gp_Cone - gp_Cylinder - gp_Dir - gp_Dir2d - gp_Elips - gp_Elips2d - gp_EulerSequence - gp_GTrsf - gp_GTrsf2d - gp_Hypr - gp_Hypr2d - gp_Lin - gp_Lin2d - gp_Mat - gp_Mat2d - gp_Parab - gp_Parab2d - gp_Pln - gp_Pnt2d - gp_Quaternion - gp_QuaternionNLerp - gp_QuaternionSLerp - gp_Sphere - gp_Torus - gp_Trsf - gp_Trsf2d - gp_TrsfForm - gp_TrsfNLerp - gp_Vec - gp_Vec2d - gp_VectorWithNullMagnitude - gp_XY - gp_XYZ

NodeMCU之快速试用(一)

NodeMCU之快速试用 https://blog.csdn.net/uestc_ganlin/article/details/78879160 NODEMCU调试心得1 https://blog.csdn.net/qq_32543253/article/details/53240034 https://github.com/nodemcu/nodemcu-firmware/tree/master 1.固件编译 这里选用云编译,通过官网: https://nodemcu-build.com/ 返回的邮件: Your NodeMCU custom build finished successfully. You may now download the firmware: - float: http://nodemcu-build.com/builds/nodemcu-master-14-modules-2018-07-12-09-20-44-float.bin - integer: http://nodemcu-build.com/builds/nodemcu-master-14-modules-2018-07-12-09-20-44-integer.bin This was built against the master branch and includes the following modules: enduser_setup, file, gpio, http, net, node, sjson, sntp, struct, tmr, uart, ucg, websocket, wifi. The files are guaranteed to be available for download for 24h. *** NEW FLASHING TOOL *** NEW FLASHING TOOL *** NEW FLASHING TOOL *** I invite you to try the new GUI tool https://github.

2.《数据结构和算法》数据结构-数组

1、数组的数据项查找方法有两种:线性查找和二分查找。 2、有序数组可以使用二分查找快速查找数据项。 3、java中有两种数据类型:基本类型和对象类型。 有序数组的优点:查找比起无序数组要快的很多,缺点是,插入的时候,靠后面的数据项都要向后移以腾出空间,所以速度相对来说是比较慢的,但是不管是有序数组还是无序数组删除都比较慢,因为删除的时候,后面的数据项都需要向前移动来填充空位。 数组的缺点:数组的删除效率比较低,在无序数组中搜索是低效的,而在有序数组中插入效率有很低,而且数组在new的时候就必须固定大小,在开发的时候很多时候数据项我们是没办法预知的,数组创建大了浪费空间,创建小了就会造成溢出。 2、数组二分查找 2.1、根据比较次数求出可比较的数值范围: 公式:R=2S R表示范围,S代表比较的次数,比如在二分查找中比较了10次,那么最高可查找的范围时多少个数据项呢? 例子:在二分查找中比较10次最高可查找多少个数据项? 210 =1024个数据项 2.2、根据数据项的项数,求出二分查找最多要比较的次数: 公式:S=log2(R) S代表比较次数,R代表范围 (以2为底的范围的对数) 例子:数组中有5000个数据项,使用二分查找最多需要比较多少次找到? Log2(5000)=12.28 四舍五入等于12 以上是这么求出来的呢?绝大部分计算器都有log功能,但是基本上都是以10为底数来求对数,但是通过将结果乘以3.322就可以轻松的换成以2为底数的对数了。例如Log10(5000)=3.69867.... 3.69897X3.322=12.28 2.3、求二分查找需要的时间 公式:T=K*log2(N) 3.0、大O表示法 大O表示法即是:粗略的度量方法。例如汽车按照尺寸可分为小型、中型、大型等,也就是在不提及具体尺寸的情况下,提供一个大致的概念。这种粗略的度量方法被称为“大O表示法”。 3.1、无序数组的插入:常量 无序数组的插入效率和数据项无关,因为新的数据项总是放在下一个有空的地方。不管数据项的个数N有多大,每一次插入所用的时间都是相同的,所以无序数组插入一个数据项的时间T是一个常量K, (K包含了处理器的效率和编译程序生成程序代码的效率等等因素所花费的时间) T=K 3.2、线性查找:与N成正比 线性查找需要比较的次数为:S=N/2搜索N个数据项所需的时间为:T=K*N/2 T表示搜索需要的时间,K为一个常量,查找每一个数据项所需的时间,包含了处理器效率和编译器的效率,N/2即比较次数 插入N个数据项需要的时间:T=K*N 3.3、大O表示法中,不需要常量 使用大O表示法去比较算法并不需要在乎具体的细微的东西,比如说处理芯片和编译器,真正需要比较的是数对应不同的N值,T是如何变化的,而不是具体的数组,所以不需要常量 用大O表示法表示运行时间: 线性查找 O(N) 二分查找 O(logN) 无序数组插入 O(1) 常量级时间 有序数组插入 O(N) 无序数组删除和有序数组删除 O(N) O(1) 优秀 O(logN) 良好 O(N) 还可以 O(N2)差