• 关于 多操作数是什么 的搜索结果

回答

mongodb好像也有连接池的概念,默认最大连接数量是1024个是有连接池的概念,但是1024不知道是指的什么。服务端最大连接是65000,客户端Java/C#默认最多连100个,NodeJS没记错应该应该是5个(因为是单线程)。1024大概是指的ulimit?这是操作系统默认给的最大打开文件数。Linux中一切皆文件,所以这个限制也会限制到网络连接数。mongobd的这个“连接”该怎么理解?比方在node中,只有一个进程启动node程序,在启动应用时候,配置了账号密码指定了数据库,随着程序启动自动连接了Mongobd数据库,这时是不是就建立了对mongodb的一个连接?对启动后的node程序接收了很多http请求,每个请求操作中,都会调用之前创建好的连接对象,执行对mongodb的操作。也就是说,不管node接收到多么多的http请求,它不就始终只有一个对mongodb的连接在操作数据库?具体应该怎样理解mongodb的连接数量?如果是这样,那默认的最大1024个连接好像也用不上了。你自己其实也提到了有连接池的概念,其实无论是在使用MongoClient或MongoDatabase对象时,其中都有连接池在运作,会根据你的并发程度创建更多的连接以满足所有请求的需要。注意NodeJS是单线程异步非阻塞式运行,所以请求数并不一定等于连接数。但这都是在说客户端。如前面撰述,1024如果是指的服务端ulimit,那服务器可能面对多个客户端,连接数为客户端连接数总和。而1024指的也不单是连接数,它包括了服务端所能打开的一切句柄,因此打开一个数据文件,一个索引,一个连接,都是要占用1024中的一个的。所以1024通常是不够的,应该调整。

李博 bluemind 2019-12-02 02:01:15 0 浏览量 回答数 0

问题

laravel-monodb 多条写操作怎么优化

蛮大人123 2019-12-01 19:56:36 1031 浏览量 回答数 1

问题

postgresql 的表设计问题和一些困惑

小旋风柴进 2019-12-01 20:15:49 1438 浏览量 回答数 1

海外云虚拟主机包年25元/月起

海外独享虚拟主机全面上线,助力构建海外网站,提升公司国际形象;全球有效覆盖,超高性价比;建站入门首选,助力出口,适合跨境贸易企业。

问题

为什么这样写显著提升了Fibonacci sequence性能??

蛮大人123 2019-12-01 20:00:27 1168 浏览量 回答数 1

问题

关于 使用Redis HASH的VALUE存放了一段JSON字符串,在并发操作时怎么保证JSON字符串的原子性 问题

爵霸 2019-12-01 20:07:07 1379 浏览量 回答数 1

回答

我们都知道虚拟机的内存划分了多个区域,并不是一张大饼。那么为什么要划分为多块区域呢,直接搞一块区域,所有用到内存的地方都往这块区域里扔不就行了,岂不痛快。是的,如果不进行区域划分,扔的时候确实痛快,可用的时候再去找怎么办呢,这就引入了第一个问题,分类管理,类似于衣柜,系统磁盘等等,为了方便查找,我们会进行分区分类。另外如果不进行分区,内存用尽了怎么办呢?这里就引入了内存划分的第二个原因,就是为了方便内存的回收。如果不分,回收内存需要全部内存扫描,那就慢死了,内存根据不同的使用功能分成不同的区域,那么内存回收也就可以根据每个区域的特定进行回收,比如像栈内存中的栈帧,随着方法的执行栈帧进栈,方法执行完毕就出栈了,而对于像堆内存的回收就需要使用经典的回收算法来进行回收了,所以看起来分类这么麻烦,其实是大有好处的。 提到虚拟机的内存结构,可能首先想起来的就是堆栈。对象分配到堆上,栈上用来分配对象的引用以及一些基本数据类型相关的值。但是·虚拟机的内存结构远比此要复杂的多。除了我们所认识的(还没有认识完全)的堆栈以外,还有程序计数器,本地方法栈和方法区。我们平时所说的栈内存,一般是指的栈内存中的局部变量表。 从图中可以看到有5大内存区域,按照是否被线程所共享可分为两部分,一部分是线程独占区域,包括Java栈,本地方法栈和程序计数器。还有一部分是被线程所共享的,包括方法区和堆。什么是线程共享和线程独占呢,非常好理解,我们知道每一个Java进行都会有多个线程同时运行,那么线程共享区的这片区域就是被所有线程一起使用的,不管有多少个线程,这片空间始终就这一个。而线程的独占区,是每个线程都有这么一份内存空间,每个线程的这片空间都是独有的,有多少个线程就有多少个这么个空间。上图的区域的大小并不代表实际内存区域的大小,实际运行过程中,内存区域的大小也是可以动态调整的。下面来具体说说每一个区域的主要功能。 程序计数器,我们在写代码的过程中,开发工具一般都会给我们标注行号方便查看和阅读代码。那么在程序在运行过程中也有一个类似的行号方便虚拟机的执行,就是程序计数器,在c语言中,我们知道会有一个goto语句,其实就是跳转到了指定的行,这个行号就是程序计数器。存储的就是程序下一条所执行的指令。这部分区域是线程所独享的区域,我们知道线程是一个顺序执行流,每个线程都有自己的执行顺序,如果所有线程共用一个程序计数器,那么程序执行肯定就会出乱子。为了保证每个线程的执行顺序,所以程序计数器是被单个线程所独显的。程序计数器这块内存区域是唯一一个在jvm规范中没有规定内存溢出的。 java虚拟机栈,java虚拟机栈是程序运行的动态区域,每个方法的执行都伴随着栈帧的入栈和出栈。 栈帧也叫过程活动记录,是编译器用来实现过程/函数调用的一种数据结构。栈帧中包括了局部变量表,操作数栈,方法返回地址以及额外的一些附加信息,在编译过程中,局部变量表的大小已经确定,操作数栈深度也已经确定,因此栈帧在运行的过程中需要分配多大的内存是固定的,不受运行时影响。对于没有逃逸的对象也会在栈上分配内存,对象的大小其实在运行时也是确定的,因此即使出现了栈上内存分配,也不会导致栈帧改变大小。 一个线程中,可能调用链会很长,很多方法都同时处于执行状态。对于执行引擎来讲,活动线程中,只有栈顶的栈帧是最有效的,称为当前栈帧,这个栈帧所关联的方法称为当前方法。执行引擎所运行的字节码指令仅对当前栈帧进行操作。Ft5rk58GfiJxcdcCzGeAt8fjkFPkMRdf 局部变量表:我们平时所说的栈内存一般就是指栈内存中的局部变量表。这里主要是存储变量所用。对于基本数据类型直接存储其值,对于引用数据类型则存储其地址。局部变量表的最小存储单位是Slot,每个Slot都能存放一个boolean、byte、char、short、int、float、reference或returnAddress类型的数据。 既然前面提到了数据类型,在此顺便说一下,一个Slot可以存放一个32位以内的数据类型,Java中占用32位以内的数据类型有boolean、byte、char、short、int、float、reference和returnAddress八种类型。前面六种不需要多解释,大家都认识,而后面的reference是对象的引用。虚拟机规范既没有说明它的长度,也没有明确指出这个引用应有怎样的结构,但是一般来说,虚拟机实现至少都应当能从此引用中直接或间接地查找到对象在Java堆中的起始地址索引和方法区中的对象类型数据。而returnAddress是为字节码指令jsr、jsr_w和ret服务的,它指向了一条字节码指令的地址。 对于64位的数据类型,虚拟机会以高位在前的方式为其分配两个连续的Slot空间。Java语言中明确规定的64位的数据类型只有long和double两种(reference类型则可能是32位也可能是64位)。值得一提的是,这里把long和double数据类型读写分割为两次32读写的做法类似。不过,由于局部变量表建立在线程的堆栈上,是线程私有的数据,无论读写两个连续的Slot是否是原子操作,都不会引起数据安全问题。 操作数栈是一个后入先出(Last In First Out, LIFO)栈。同局部变量表一样,操作数栈的最大深度也在编译的时候被写入到字节码文件中,关于字节码文件,后面我会具体的来描述。操作数栈的每一个元素可以是任意的Java数据类型,包括long和double。32位数据类型所占的栈容量为1,64位数据类型所占的栈容量为2。在方法执行的任何时候,操作数栈的深度都不会超过在max_stacks数据项中设定的最大值。 当一个方法刚刚开始执行的时候,这个方法的操作数栈是空的,在方法的执行过程中,会有各种字节码指令向操作数栈中写入和提取内容,也就是入栈出栈操作。例如,在做算术运算的时候是通过操作数栈来进行的,又或者在调用其他方法的时候是通过操作数栈来进行参数传递的。 举个例子,整数加法的字节码指令iadd在运行的时候要求操作数栈中最接近栈顶的两个元素已经存入了两个int型的数值,当执行这个指令时,会将这两个int值和并相加,然后将相加的结果入栈。 操作数栈中元素的数据类型必须与字节码指令的序列严格匹配,在编译程序代码的时候,编译器要严格保证这一点,在类校验阶段的数据流分析中还要再次验证这一点。再以上面的iadd指令为例,这个指令用于整型数加法,它在执行时,最接近栈顶的两个元素的数据类型必须为int型,不能出现一个long和一个float使用iadd命令相加的情况。 本地方法栈 与虚拟机栈所发挥的作用是非常相似的,其区别不过是虚拟机栈为虚拟机执行Java方法(也就是字节码)服务,而本地方法栈则是为虚拟机使用到的Native方法服务。虚拟机规范中对本地方法栈中的方法使用的语言、使用方式与数据结构并没有强制规定,因此具体的虚拟机可以自由实现它。甚至有的虚拟机(譬如Sun HotSpot虚拟机)直接就把本地方法栈和虚拟机栈合二为一。与虚拟机栈一样,本地方法栈区域也会抛出StackOverflowError和OutOfMemoryError异常。 方法区经常会被人称之为永久代,但这俩并不是一个概念。首先永久代的概念仅仅在HotSpot虚拟机中存在,不幸的是,在jdk8中,Hotspot去掉了永久代这一说法,使用了Native Memory,也就是Metaspace空间。那么方法区是干嘛的呢?我们可以这么理解,我们要运行Java代码,首先需要编译,然后才能运行。在运行的过程中,我们知道首先需要加载字节码文件。也就是说要把字节码文件加载到内存中。好了,问题就来了,字节码文件放到内存中的什么地方呢,就是方法区中。当然除了编译后的字节码之外,方法区中还会存放常量,静态变量以及及时编译器编译后的代码等数据。 堆,一般来讲堆内存是Java虚拟机中最大的一块内存区域,同方法区一样,是被所有线程所共享的区域。此区域所存在的唯一目的就存放对象的实例(对象实例并不一定全部在堆中创建)。堆内存是垃圾收集器主要光顾的区域,一般来讲根据使用的垃圾收集器的不同,堆中还会划分为一些区域,比如新生代和老年代。新生代还可以再划分为Eden,Survivor等区域。另外为了性能和安全性的角度,在堆中还会为线程划分单独的区域,称之为线程分配缓冲区。更细致的划分是为了让垃圾收集器能够更高效的工作,提高垃圾收集的效率。 如果想要了解更多的关于虚拟机的内容,可以观看录制的<深入理解Java虚拟机>这套视频教程。

zwt9000 2019-12-02 00:21:07 0 浏览量 回答数 0

问题

poi操作 word问题? 400 报错

爱吃鱼的程序员 2020-06-02 14:15:46 0 浏览量 回答数 1

问题

poi操作 word问题? 400 报错

爱吃鱼的程序员 2020-06-22 23:11:12 0 浏览量 回答数 1

回答

printf("aaa\n");这不是在打印a字符吗?,而且,只有段越界才会引起进程的段错误信号,你访问的地址仍然在进程的合法空间范围内,当然空指针这类地址基本不合法。回复 @xxdd:看看gdb进程的infoprocmappings或者去cat/proc/$pid/maps,崩溃指的是程序read,write,execute了一个virtualaddress,这个address不在操作系统给其进程分配的虚拟地址段之内,称其为段错误回复 @xxdd:我的理解是,只有当指针指向只读区域时,你更改才会报错。想想八门神器,一个程序都可以改别的程序里的内存值,这不就很好的解释了你的疑问了吗?您好,我指的是fun()函数里面的n[111],已经越界了,为什么程序可以正常运行,而不是崩溃? 因为根本报不了错。 编译器,编译器怎么判断数组下标的范围?没有任何一种万无一失的方法,最多用静态检查工具,处理掉一些错误。 运行期,程序持有的信息更少,数组元素的访问就是数组其实元素的地址+偏移量计算出地址。这个时候就是对地址的直接访问,运行期是不会记录类型信息的,根本不知道这个数组设定的大小。这个时候程序是否崩溃就要看人品了,只有操作系统发现你访问了不该访问的内存区域,程序才会崩溃。谢谢,应该是这样的。c++本来就不会检查边界的,所以遇到数组参数的时候,一般会加一个长度,而java是基于这个问题做了优化编译器不检查,但是为什么运行的时候,也不报错? 数组下标越界是undefinedbehavior. 结果是未定义的知道什么意思吧 两种写法程序都可以正常运行,为啥?明明操作了非法的地址。越界是 undefinedbehavior。所谓 undefinedbehavior就是怎样都行,可以崩溃、可以什么都不干。你如果非要问为什么C++这样规定,那是因为检查这些错误代价实在太大了。您好,我想知道的是,为什么这个程序可以正常运行?数组已经指向了非法的地址。数组传递变成指针,他允许你进行修改,改的对不对成了问题 你把堆改成栈再试试回复 @xxdd:堆所分配的是系统中剩余的可用内存。new出来的内存指针所指向的地址,在你指定的大小之后,仍然可能有很大一块可用内存,不报错是有可能的。inta[2];fun(a);这个就是栈吧?这应该和系统内存分配有关系吧,报错应该是系统认为地址非法给你报错,系统肯定是认为你这个地址不非法呗,所以不报错newint[2]是从堆上分配的,数组越界是未定义行为,可能是没有进程默认堆大,没有非法访问,所以没有coredump掉。你越界大一些看看好像是这个原因,那栈上那个为什么也不报错? 楼主听说过“缓冲区溢出”的说法吧 我个人理解一个指针本来就能在自己的地盘里指来指去,想要指到哪里是程序员的自由,编译器不做这方面的任何限制与检查。 Linux上检查缓冲区溢出跟内存泄露可以试试valgrind还有电网electric-fence

爱吃鱼的程序员 2020-06-12 14:05:26 0 浏览量 回答数 0

回答

首先你要知道redis除了持久化,几乎所有操作都是在操作内存,比如像简单的set get操作都非常快,具体多快我觉得你可以自己来做一个benchmark,并不难如果你关注新闻的话可以知道双11阿里的交易巅峰值是14w笔/s这基本已经是国内it界最高的并发了(那种几亿同时在线的不算),你再去想想操作内存的时间,不考虑事务,我只把14w条数据记下来看起来并不是什么难事对不对一台写不过来我十台总行了吧,所以除非你的set的value本身特别大,不用担心在操作时的等待时间,就算有1w个请求过来,你还是在操作内存,严格意义上说,redis本身应对的业务场景并不是一个高并发的场景,你看一下redis本身默认的连接数设置应该也就懂了应对这种场景,你用多线程+锁也没有什么问题(当然性能可能会差一点点),之前tim大神做过一个memcached和redis的性能对比,虽然年代久远,不过也可以说明一些问题,要知道memcached就是多线程+锁的模型,两者看起来差别也没有太过夸张。虽然结果是redis好一些。看到这里你是不是觉得单线程+io复用赢了?这可真不一定。。只是在这种场景下赢了而已,本身单线程io复用和多线程+锁其实只是两种编程模型,两种模型也都是为了解决问题,哪种优要看具体的业务场景,这里还是要说了,不服跑分啊go的goroutine本质是green threads,runtime来调度的用户态线程,其实这种概念在其他语言里也有,只是其他语言都是以第三方库来做这件事情,go把它集成在了语言内,并且不用你自己去管理调度的事情,go语言里的实现只是让你可以更方便地写而已,所以这东西并不是银弹,不用太过迷信,go所带来的更重要的是开发效率的提升,并没有解决什么具体的问题。关于epoll,go语言的net库底层也是用epoll来做io复用的(仅指linux平台),epoll这个东西只是linux下的一种io复用的实现,在其他的发行版里还有其他变种,而程序员们其实不太想关心你这些事情,他们希望在linux下写的程序去freebsd还能跑,所以libevent棒棒哒,当然你写go的话,这些事情不用操心。

a123456678 2019-12-02 02:57:25 0 浏览量 回答数 0

回答

Block 的确很有很多优势,比如同样代码使用 block 替代,大多数情况下,可以减少代码的量。Block 可以降低我们对 delegate 的依赖:在 block 出现以前,我们如果调用一段代码,在一段时间之后它会给我们返回,这时我们就需要用到 delegate 或者 NSNotification, 当然使用 delegate 和 Notification 是没什么问题的,但是使用过 delegate 和 Notification 就会知道,我们需要把与它们相关的代码写的到处都是。使用 block 可以在一定程度上避免这个问题。本身 block 就是一个普通的 Objective-C 对象,正因为是个对象,所以 block 可以被作为参数传递,也可以作为返回值返回,或者可以用来给变量赋值。理论上说,我们写的绝大部分代码都可以写成 block 形式。但是,毕竟 block 的语法和我们一般使用的有所不同,太多的使用反而可能造成代码混乱,可读性变差。我一般的习惯是,涉及 UIAnimation 时会使用,这个大家平时使用的肯定不少。还有就是涉及一些数组的操作会使用,有一些例如 enumerateObjectsUsingBlock 这样的方法,会使操作数组变得非常方便。

a123456678 2019-12-02 03:15:02 0 浏览量 回答数 0

问题

关于 MySQL存储访问量,关注数等更新比较频繁的数据的时候,怎么减轻数据库负担?

爵霸 2019-12-01 20:10:19 913 浏览量 回答数 1

问题

C语言里这个符号 → 是干什么用的?

杨冬芳 2019-12-01 19:32:10 901 浏览量 回答数 1

回答

开发者您好, 对于一些高级程序语言的,它的元素类型没有严格的要求,它有一个标准的叫法叫做泛型,它就是说任何一个单元类型都可以放进去。 对于数组,它底层的硬件实现,有一个叫内存管理器的东西,每当你申请数组的话,计算机实际上是在内存中,给你开辟了(申请了)一段连续的地址,每一个地址都可以直接通过内存管理器进行访问。这张图里示意的地方就是它相应的内存地址。直接访问方面,它访问第一个元素和访问中间某个元素,时间复杂度都是一样的。也就是常数时间称为O(1)。从这里可以总结出它可以进行随机地访问任何的一个元素,访问速度非常快,这也是它的特性之一。 对于JS,假如有一个数组含有ABCEFG,我们想把元素D插入到数组中输出ABCDEFG。这个时候需要把EFG往下挪一个位置,而这样的操作导致了时间复杂度不再是常数级了,而是O(n)的时间复杂度。在最坏的情况甚至需要挪动整个数组;最好的情况下插入到最后面就变成了O(1);平均情况下需要移动一半的元素位置。同理可得,进行删除操作的时候一样。平均时间复杂度O(n)。 由此可见,如果对数组进行大量的增删操作,它会涉及到非常多的array copy,这样它的时间复杂度不是特别高效的。其实这个问题不仅仅存在于JS,Java也是如此,举个例子,ensure capacity 所进行的操作其实相对暴力,它会先查找整个数组的实际长度,如果长度够的话就什么都不做;如果长度不够的话,那么它会直接new一个新的数组出来,新的数组长度是当前长度乘以2,把老数组的值拷贝到新数组上面去。 针对您说的,是否在工作中动态扩展阵列或其他一些性能提升算法?我觉得您可以参考工业上那些已经千锤百炼的老代码,他们的做法,从两点触发:空间换时间、升维。 祝您在喜欢的技术道路上越走越好

罗思雨 2020-02-12 14:50:33 0 浏览量 回答数 0

回答

NDB: 基于集群的引擎-数据被自动切分并复制到数个机器上(数据节点), 适合于那些需要极高查询性能和高可用性的应用, 原来是为爱立信的电信应用设计的。 NDB提供了高达99.999%的可靠性,在读操作多的应用中表现优异。 对于有很多并发写操作的应用, 还是推荐用InnoDB。如果你网站并发高,数据量不会大到需要去集群管理 还是推荐用innodb吧,如果只是小应用没什么数据请求量 MyISAM的读取速度更快些

落地花开啦 2019-12-02 01:43:21 0 浏览量 回答数 0

问题

JavaScript中对象/数组的性能如何?(特别是对于Google V8)

保持可爱mmm 2020-02-08 11:01:21 2 浏览量 回答数 1

回答

算法是比较复杂又基础的学科,每个学编程的人都会学习大量的算法。而根据统计,以下这18个问题是面试中最容易遇到的,本文给出了一些基本答案,供算法方向工程师或对此感兴趣的程序员参考。 1)请简单解释算法是什么? 算法是一个定义良好的计算过程,它将一些值作为输入并产生相应的输出值。简单来说,它是将输入转换为输出的一系列计算步骤。 2)解释什么是快速排序算法? 快速排序算法能够快速排序列表或查询。它基于分割交换排序的原则,这种类型的算法占用空间较小,它将待排序列表分为三个主要部分: ·小于Pivot的元素 ·枢轴元素Pivot(选定的比较值) ·大于Pivot的元素 3)解释算法的时间复杂度? 算法的时间复杂度表示程序运行完成所需的总时间,它通常用大O表示法来表示。 4)请问用于时间复杂度的符号类型是什么? 用于时间复杂度的符号类型包括: ·Big Oh:它表示小于或等于目标多项式 ·Big Omega:它表示大于或等于目标多项式 ·Big Theta:它表示与目标多项式相等 ·Little Oh:它表示小于目标多项式 ·Little Omega:它表示大于目标多项式 5)解释二分法检索如何工作? 在二分法检索中,我们先确定数组的中间位置,然后将要查找的值与数组中间位置的值进行比较,若小于数组中间值,则要查找的值应位于该中间值之前,依此类推,不断缩小查找范围,直至得到最终结果。 6)解释是否可以使用二分法检索链表? 由于随机访问在链表中是不可接受的,所以不可能到达O(1)时间的中间元素。因此,对于链表来说,二分法检索是不可以的(对顺序链表或排序后的链表是可以用的)。 7)解释什么是堆排序? 堆排序可以看成是选择排序的改进,它可以定义为基于比较的排序算法。它将其输入划分为未排序和排序的区域,通过不断消除最小元素并将其移动到排序区域来收缩未排序区域。 8)说明什么是Skip list? Skip list数据结构化的方法,它允许算法在符号表或字典中搜索、删除和插入元素。在Skip list中,每个元素由一个节点表示。搜索函数返回与key相关的值的内容。插入操作将指定的键与新值相关联,删除操作可删除指定的键。 9)解释插入排序算法的空间复杂度是多少? 插入排序是一种就地排序算法,这意味着它不需要额外的或仅需要少量的存储空间。对于插入排序,它只需要将单个列表元素存储在初始数据的外侧,从而使空间复杂度为O(1)。 10)解释什么是“哈希算法”,它们用于什么? “哈希算法”是一个哈希函数,它使用任意长度的字符串,并将其减少为唯一的固定长度字符串。它用于密码有效性、消息和数据完整性以及许多其他加密系统。 11)解释如何查找链表是否有循环? 要知道链表是否有循环,我们将采用两个指针的方法。如果保留两个指针,并且在处理两个节点之后增加一个指针,并且在处理每个节点之后,遇到指针指向同一个节点的情况,这只有在链表有循环时才会发生。 12)解释加密算法的工作原理? 加密是将明文转换为称为“密文”的密码格式的过程。要转换文本,算法使用一系列被称为“键”的位来进行计算。密钥越大,创建密文的潜在模式数越多。大多数加密算法使用长度约为64到128位的固定输入块,而有些则使用流方法。 13)列出一些常用的加密算法? 一些常用的加密算法是: ·3-way ·Blowfish ·CAST ·CMEA ·GOST ·DES 和Triple DES ·IDEA ·LOKI等等 14)解释一个算法的最佳情况和最坏情况之间有什么区别? ·最佳情况:算法的最佳情况解释为算法执行最佳的数据排列。例如,我们进行二分法检索,如果目标值位于正在搜索的数据中心,则这就是最佳情况,最佳情况时间复杂度为0。 ·最差情况:给定算法的最差输入参考。例如快速排序,如果选择关键值的子列表的最大或最小元素,则会导致最差情况出现,这将导致时间复杂度快速退化到O(n2)。 15)解释什么是基数排序算法? 基数排序又称“桶子法”,是通过比较数字将其分配到不同的“桶里”来排序元素的。它是线性排序算法之一。 16)解释什么是递归算法? 递归算法是一个解决复杂问题的方法,将问题分解成较小的子问题,直到分解的足够小,可以轻松解决问题为止。通常,它涉及一个调用自身的函数。 17)提到递归算法的三个定律是什么? 所有递归算法必须遵循三个规律: ·递归算法必须有一个基点 ·递归算法必须有一个趋向基点的状态变化过程 ·递归算法必须自我调用 18)解释什么是冒泡排序算法? 冒泡排序算法也称为下沉排序。在这种类型的排序中,要排序的列表的相邻元素之间互相比较。如果它们按顺序排列错误,将交换值并以正确的顺序排列,直到最终结果“浮”出水面。 满意记得采纳哈

玄学酱 2019-12-02 01:18:44 0 浏览量 回答数 0

回答

TensorFlow 什么是TensorFlow? 该库是由Google与Brain Team合作开发的。TensorFlow几乎在每个Google应用程序中用于机器学习。 TensorFlow的工作方式类似于编写涉及大量张量操作的新算法的计算库。由于神经网络可以很容易地表示为计算图形,因此它们可以使用TensorFlow作为Tensors上的一系列操作来实现。此外,张量是表示数据的N维矩阵。 TensorFlow的特点 TensorFlow针对速度进行了优化,它利用XLA等技术实现快速线性代数运算。 使用TensorFlow,我们可以轻松地可视化图形的每个部分,这在使用Numpy或SciKit时不是一个选项。 其中一个非常重要的Tensorflow功能是它的可操作性非常灵活,这意味着它具有模块化,并且对于您想要独立的部分,它为您提供了这一选择。 它可以在CPU和GPU上轻松训练,用于分布式计算。 TensorFlow提供流水线操作,从某种意义上说,您可以训练多个神经网络和多个GPU,这使得模型在大规模系统上非常高效。已经有一大批软件工程师不断致力于稳定性改进。而且它是开源的,所以只要有互联网连接,任何人都可以使用它。 NumPy 什么是Numpy? Numpy被认为是Python中最受欢迎的机器学习库之一。TensorFlow和其他库在内部使用Numpy在Tensors上执行多个操作。数组接口是Numpy的最佳和最重要的功能。 Numpy的特点 Numpy非常具有交互性且易于使用;使复杂的数学实现变得非常简单;使编码变得简单易懂并且理解概念很容易;广泛使用,因此有很多开源贡献。 Scikit-Learn 什么是Scikit-Learn? 它是一个与NumPy和SciPy相关联的Python库。它被认为是处理复杂数据的最佳库之一。 这个库中有很多变化。一种修改是交叉验证功能,可以使用多个指标。物流回归和最近邻居等许多培训方法都得到了一些改进。 Scikit-Learn的特点 有多种方法可以检查监督模型对看不见的数据的准确性;无监督学习算法:同样,在提供中有大量的算法 - 从聚类,因子分析和主成分分析到无监督神经网络;用于从图像和文本中提取特征。

剑曼红尘 2020-03-26 13:02:32 0 浏览量 回答数 0

问题

读取数组的`length`属性真的在JavaScript中花费那么昂贵吗?

保持可爱mmm 2020-02-09 12:10:30 0 浏览量 回答数 1

回答

1 js 的基本数据类型? 2 JavaScript 有几种类型的值? 3 什么是堆?什么是栈?它们之间有什么区别和联系? 4 内部属性 [Class] 是什么? 5 介绍 js 有哪些内置对象? 6 undefined 与 undeclared 的区别? 7 null 和 undefined 的区别? 8 如何获取安全的 undefined 值? 9 说几条写 JavaScript 的基本规范? 10 JavaScript 原型,原型链? 有什么特点? 11 js 获取原型的方法? 12 在 js 中不同进制数字的表示方式? 13 js 中整数的安全范围是多少? 14 typeof NaN 的结果是什么? 15 isNaN 和 Number.isNaN 函数的区别? 16 Array 构造函数只有一个参数值时的表现? 17 其他值到字符串的转换规则? 18 其他值到数字值的转换规则? 19 其他值到布尔类型的值的转换规则? 20 {} 和 [] 的 valueOf 和 toString 的结果是什么? 21 什么是假值对象? 22 ~ 操作符的作用? 23 解析字符串中的数字和将字符串强制类型转换为数字的返回结果都是数字,它们之间的区别是什么? 24 + 操作符什么时候用于字符串的拼接? 25 什么情况下会发生布尔值的隐式强制类型转换? 26 || 和 && 操作符的返回值? 27 Symbol 值的强制类型转换? 28 == 操作符的强制类型转换规则? 29 如何将字符串转化为数字,例如 '12.3b'? 30 如何将浮点数点左边的数每三位添加一个逗号,如 12000000.11 转化为『12,000,000.11』? 31 常用正则表达式? 32 生成随机数的各种方法? 33 如何实现数组的随机排序? 34 javascript 创建对象的几种方式? 35 JavaScript 继承的几种实现方式? 36 寄生式组合继承的实现? 37 Javascript 的作用域链? 38 谈谈 This 对象的理解。 39 eval 是做什么的? 40 什么是 DOM 和 BOM? 41 写一个通用的事件侦听器函数。 42 事件是什么?IE 与火狐的事件机制有什么区别? 如何阻止冒泡? 43 三种事件模型是什么? 44 事件委托是什么? 45 ['1', '2', '3'].map(parseInt) 答案是多少? 46 什么是闭包,为什么要用它? 47 javascript 代码中的 'use strict'; 是什么意思 ? 使用它区别是什么? 48 如何判断一个对象是否属于某个类? 49 instanceof 的作用? 50 new 操作符具体干了什么呢?如何实现? 51 Javascript 中,有一个函数,执行时对象查找时,永远不会去查找原型,这个函数是? 52 对于 JSON 的了解? 53 [].forEach.call($$(''),function(a){a.style.outline='1px solid #'+(~~(Math.random()(1<<24))).toString(16)}) 能解释一下这段代码的意思吗? 54 js 延迟加载的方式有哪些? 55 Ajax 是什么? 如何创建一个 Ajax? 56 谈一谈浏览器的缓存机制? 57 Ajax 解决浏览器缓存问题? 58 同步和异步的区别? 59 什么是浏览器的同源政策? 60 如何解决跨域问题? 61 服务器代理转发时,该如何处理 cookie? 62 简单谈一下 cookie ? 63 模块化开发怎么做? 64 js 的几种模块规范? 65 AMD 和 CMD 规范的区别? 66 ES6 模块与 CommonJS 模块、AMD、CMD 的差异。 67 requireJS 的核心原理是什么?(如何动态加载的?如何避免多次加载的?如何 缓存的?) 68 JS 模块加载器的轮子怎么造,也就是如何实现一个模块加载器? 69 ECMAScript6 怎么写 class,为什么会出现 class 这种东西? 70 documen.write 和 innerHTML 的区别? 71 DOM 操作——怎样添加、移除、移动、复制、创建和查找节点? 72 innerHTML 与 outerHTML 的区别? 73 .call() 和 .apply() 的区别? 74 JavaScript 类数组对象的定义? 75 数组和对象有哪些原生方法,列举一下? 76 数组的 fill 方法? 77 [,,,] 的长度? 78 JavaScript 中的作用域与变量声明提升? 79 如何编写高性能的 Javascript ? 80 简单介绍一下 V8 引擎的垃圾回收机制 81 哪些操作会造成内存泄漏? 82 需求:实现一个页面操作不会整页刷新的网站,并且能在浏览器前进、后退时正确响应。给出你的技术实现方案? 83 如何判断当前脚本运行在浏览器还是 node 环境中?(阿里) 84 把 script 标签放在页面的最底部的 body 封闭之前和封闭之后有什么区别?浏览器会如何解析它们? 85 移动端的点击事件的有延迟,时间是多久,为什么会有? 怎么解决这个延时? 86 什么是“前端路由”?什么时候适合使用“前端路由”?“前端路由”有哪些优点和缺点? 87 如何测试前端代码么? 知道 BDD, TDD, Unit Test 么? 知道怎么测试你的前端工程么(mocha, sinon, jasmin, qUnit..)? 88 检测浏览器版本版本有哪些方式? 89 什么是 Polyfill ? 90 使用 JS 实现获取文件扩展名? 91 介绍一下 js 的节流与防抖? 92 Object.is() 与原来的比较操作符 '==='、'==' 的区别? 93 escape,encodeURI,encodeURIComponent 有什么区别? 94 Unicode 和 UTF-8 之间的关系? 95 js 的事件循环是什么? 96 js 中的深浅拷贝实现? 97 手写 call、apply 及 bind 函数 98 函数柯里化的实现 99 99. 为什么 0.1 + 0.2 != 0.3?如何解决这个问题? 100 原码、反码和补码的介绍 101 toPrecision 和 toFixed 和 Math.round 的区别? 102 什么是 XSS 攻击?如何防范 XSS 攻击? 103 什么是 CSP? 104 什么是 CSRF 攻击?如何防范 CSRF 攻击? 105 什么是 Samesite Cookie 属性? 106 什么是点击劫持?如何防范点击劫持? 107 SQL 注入攻击? 108 什么是 MVVM?比之 MVC 有什么区别?什么又是 MVP ? 109 vue 双向数据绑定原理? 110 Object.defineProperty 介绍? 111 使用 Object.defineProperty() 来进行数据劫持有什么缺点? 112 什么是 Virtual DOM?为什么 Virtual DOM 比原生 DOM 快? 113 如何比较两个 DOM 树的差异? 114 什么是 requestAnimationFrame ? 115 谈谈你对 webpack 的看法 116 offsetWidth/offsetHeight,clientWidth/clientHeight 与 scrollWidth/scrollHeight 的区别? 117 谈一谈你理解的函数式编程? 118 异步编程的实现方式? 119 Js 动画与 CSS 动画区别及相应实现 120 get 请求传参长度的误区 121 URL 和 URI 的区别? 122 get 和 post 请求在缓存方面的区别 123 图片的懒加载和预加载 124 mouseover 和 mouseenter 的区别? 125 js 拖拽功能的实现 126 为什么使用 setTimeout 实现 setInterval?怎么模拟? 127 let 和 const 的注意点? 128 什么是 rest 参数? 129 什么是尾调用,使用尾调用有什么好处? 130 Symbol 类型的注意点? 131 Set 和 WeakSet 结构? 132 Map 和 WeakMap 结构? 133 什么是 Proxy ? 134 Reflect 对象创建目的? 135 require 模块引入的查找方式? 136 什么是 Promise 对象,什么是 Promises/A+ 规范? 137 手写一个 Promise 138 如何检测浏览器所支持的最小字体大小? 139 怎么做 JS 代码 Error 统计? 140 单例模式模式是什么? 141 策略模式是什么? 142 代理模式是什么? 143 中介者模式是什么? 144 适配器模式是什么? 145 观察者模式和发布订阅模式有什么不同? 146 Vue 的生命周期是什么? 147 Vue 的各个生命阶段是什么? 148 Vue 组件间的参数传递方式? 149 computed 和 watch 的差异? 150 vue-router 中的导航钩子函数 151 两个router 的区别? 152 vue 常用的修饰符? 153 computed 和 watch 区别? 154 keep-alive 组件有什么作用? 155 vue 中 mixin 和 mixins 区别? 156 开发中常用的几种 Content-Type ? 157 如何封装一个 javascript 的类型判断函数? 158 如何判断一个对象是否为空对象? 159 使用闭包实现每隔一秒打印 1,2,3,4 160 手写一个 jsonp 161 手写一个观察者模式? 162 EventEmitter 实现 163 一道常被人轻视的前端 JS 面试题 164 如何确定页面的可用性时间,什么是 Performance API? 165 js 中的命名规则 166 js 语句末尾分号是否可以省略? 167 Object.assign() 168 Math.ceil 和 Math.floor 169 js for 循环注意点 170 一个列表,假设有 100000 个数据,这个该怎么办? 171 js 中倒计时的纠偏实现? 172 进程间通信的方式? 173 如何查找一篇英文文章中出现频率最高的单词? 174 174道 JavaScript 面试题,合集

剑曼红尘 2020-04-02 14:05:35 0 浏览量 回答数 0

问题

schema设计原则是什么

云栖大讲堂 2019-12-01 21:31:30 1293 浏览量 回答数 0

问题

生产环境中,Socket 错误 EINTR 一般是由于什么原因触发的?

落地花开啦 2019-12-01 19:55:47 1096 浏览量 回答数 1

问题

poi操作 word问题 400 请求出错 

黄一刀 2020-05-26 21:13:32 19 浏览量 回答数 1

回答

package temp; import sun.misc.Sort; /** * @author zengjl * @version 1.0 * @since 2007-08-22 * @Des java几种基本排序方法 */ /** * SortUtil:排序方法 * 关于对排序方法的选择:这告诉我们,什么时候用什么排序最好。当人们渴望先知道排在前面的是谁时, * 我们用选择排序;当我们不断拿到新的数并想保持已有的数始终有序时,我们用插入排序;当给出的数 * 列已经比较有序,只需要小幅度的调整一下时,我们用冒泡排序。 */ public class SortUtil extends Sort { /** * 插入排序法 * @param data * @Des 插入排序(Insertion Sort)是,每次从数列中取一个还没有取出过的数,并按照大小关系插入到已经取出的数中使得已经取出的数仍然有序。 */ public int[] insertSort(int[] data) { 1/11页 int temp; for (int i = 1; i < data.length; i++) { for (int j = i; (j > 0) && (data[j] < data[j - 1]); j--) { swap(data, j, j - 1); } } return data; } /** * 冒泡排序法 * @param data * @return * @Des 冒泡排序(Bubble Sort)分为若干趟进行,每一趟排序从前往后比较每两个相邻的元素的大小(因此一趟排序要比较n-1对位置相邻的数)并在 * 每次发现前面的那个数比紧接它后的数大时交换位置;进行足够多趟直到某一趟跑完后发现这一趟没有进行任何交换操作(最坏情况下要跑n-1趟, * 这种情况在最小的数位于给定数列的最后面时发生)。事实上,在第一趟冒泡结束后,最后面那个数肯定是最大的了,于是第二次只需要对前面n-1 * 个数排序,这又将把这n-1个数中最小的数放到整个数列的倒数第二个位置。这样下去,冒泡排序第i趟结束后后面i个数都已经到位了,第i+1趟实 * 际上只考虑前n-i个数(需要的比较次数比前面所说的n-1要小)。这相当于用数学归纳法证明了冒泡排序的正确性

游客886 2019-12-02 01:17:49 0 浏览量 回答数 0

回答

错误代码出现原因有很多种: 1.在装系统时没有装好; 2.电脑的有些硬件驱动没有装好; 3.系统的缓存不够,太小了; 4.某些应用程序在安装有些文件会与系统文件相互共用,一但你删除或损坏这个程序的话,也就等于损坏了系统.计算机出现错误代码大部分是以上四个情况导致的,建议你根据不同的情况进行修复! 其实,无论是什么软件、什么程序,都是由程序员进行编写的 每个程序员都希望能编写出完美的应用程序代码 但难免会有疏忽之处.原因有多种: 一.编译错误,是由于不正确编写代码而产生.如非法实用或丢失关键字,遗漏必要的标点符号,函数调用缺参数或括号不匹配等.其它如变量未采用强制显式声明等而引起的错误.VB通常会在代码写时或运行时报错,按报错提示查找解决. 二.运行时出错,是指应用程序在运行其间执行非法操作或某些操作失败,如要打开的文件没找到,磁盘空间不够,除发运算中除数为0等.数组下标越界是一种典型的运行时错误,只有在运行时才会发现.三.逻辑错误,语法上找不出错误,应用程序也能运行,但得不到到预期结果,需认真分析并借助调试工具才能查出错误原因并改正. 可能网断了 视频播放失败 来源于网络,供您参考

保持可爱mmm 2019-12-02 02:20:23 0 浏览量 回答数 0

回答

Arraylist和Vector是采用数组方式存储数据,此数组元素数大于实际存储的数据以便增加插入元素,都允许直接序号索引元素,但是插入数据要涉及到数组元素移动等内存操作,所以插入数据慢,查找有下标,所以查询数据快,Vector由于使用了synchronized方法-线程安全,所以性能上比ArrayList要差,LinkedList使用双向链表实现存储,按序号索引数据需要进行向前或向后遍历,但是插入数据时只需要记录本项前后项即可,插入数据较快。线性表,链表,哈希表是常用的数据结构,在进行java开发时,JDK已经为我们提供了一系列相应的类实现基本的数据结构,这些结构均在java.util包中,collection├List│├LinkedList│├ArrayList│└Vector│ └Stack└SetMap├Hashtable├HashMap└WeakHashMapCollection接口Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(elements),一些Collection允许相同的元素而另一些不行。一些能排序而另一些不行。Java SDK不提供直接继承自Collection的类,Java SDK提供的类都是继承自Collection的“子接口”如List和Set。所有实现Collection接口的类都必须提供两个标准的构造函数:无参数的构造函数用于创建一个空的Collection,有一个Collection参数的构造函数用于创建一个新的Collection,这个新的Collection与传入的Collection有相同的元素。后一个构造函数允许用户复制一个Collection。如何遍历Collection中的每一个元素?不论Collection的实际类型如何,它都支持一个iterator()的方法,该方法返回一个迭代子,使用该迭代子即可逐一访问Collection中每一个元素。典型的用法如下:    Iterator it = collection.iterator(); // 获得一个迭代子    while(it.hasNext()) {      Object obj = it.next(); // 得到下一个元素    }  由Collection接口派生的两个接口是List和Set。List接口  List是有序的Collection,使用此接口能够精确的控制每个元素插入的位置。用户能够使用索引(元素在List中的位置,类似于数组下标)来访问List中的元素,这类似于Java的数组。和下面要提到的Set不同,List允许有相同的元素。  除了具有Collection接口必备的iterator()方法外,List还提供一个listIterator()方法,返回一个ListIterator接口,和标准的Iterator接口相比,ListIterator多了一些add()之类的方法,允许添加,删除,设定元素,还能向前或向后遍历。  实现List接口的常用类有LinkedList,ArrayList,Vector和Stack。ArrayList类  ArrayList实现了可变大小的数组。它允许所有元素,包括null。ArrayList没有同步。size,isEmpty,get,set方法运行时间为常数。但是add方法开销为分摊的常数,添加n个元素需要O(n)的时间。其他的方法运行时间为线性。  每个ArrayList实例都有一个容量(Capacity),即用于存储元素的数组的大小。这个容量可随着不断添加新元素而自动增加,但是增长算法并没有定义。当需要插入大量元素时,在插入前可以调用ensureCapacity方法来增加ArrayList的容量以提高插入效率。  和LinkedList一样,ArrayList也是非同步的(unsynchronized)。Vector类  Vector非常类似ArrayList,但是Vector是同步的。由Vector创建的Iterator,虽然和ArrayList创建的Iterator是同一接口,但是,因为Vector是同步的,当一个Iterator被创建而且正在被使用,另一个线程改变了Vector的状态(例如,添加或删除了一些元素),这时调用Iterator的方法时将抛出ConcurrentModificationException,因此必须捕获该异常。Stack 类  Stack继承自Vector,实现一个后进先出的堆栈。Stack提供5个额外的方法使得Vector得以被当作堆栈使用。基本的push和pop方法,还有peek方法得到栈顶的元素,empty方法测试堆栈是否为空,search方法检测一个元素在堆栈中的位置。Stack刚创建后是空栈。Map接口  请注意,Map没有继承Collection接口,Map提供key到value的映射。一个Map中不能包含相同的key,每个key只能映射一个value。Map接口提供3种集合的视图,Map的内容可以被当作一组key集合,一组value集合,或者一组key-value映射。Hashtable类  Hashtable继承Map接口,实现一个key-value映射的哈希表。任何非空(non-null)的对象都可作为key或者value。  添加数据使用put(key, value),取出数据使用get(key),这两个基本操作的时间开销为常数。Hashtable通过initial capacity和load factor两个参数调整性能。通常缺省的load factor 0.75较好地实现了时间和空间的均衡。增大load factor可以节省空间但相应的查找时间将增大,这会影响像get和put这样的操作。使用Hashtable的简单示例如下,将1,2,3放到Hashtable中,他们的key分别是”one”,”two”,”three”:    Hashtable numbers = new Hashtable();    numbers.put(“one”, new Integer(1));    numbers.put(“two”, new Integer(2));    numbers.put(“three”, new Integer(3));  要取出一个数,比如2,用相应的key:    Integer n = (Integer)numbers.get(“two”);    System.out.println(“two = ” + n);  由于作为key的对象将通过计算其散列函数来确定与之对应的value的位置,因此任何作为key的对象都必须实现hashCode和equals方法。hashCode和equals方法继承自根类Object,如果你用自定义的类当作key的话,要相当小心,按照散列函数的定义,如果两个对象相同,即obj1.equals(obj2)=true,则它们的hashCode必须相同,但如果两个对象不同,则它们的hashCode不一定不同,如果两个不同对象的hashCode相同,这种现象称为冲突,冲突会导致操作哈希表的时间开销增大,所以尽量定义好的hashCode()方法,能加快哈希表的操作。  如果相同的对象有不同的hashCode,对哈希表的操作会出现意想不到的结果(期待的get方法返回null),要避免这种问题,只需要牢记一条:要同时复写equals方法和hashCode方法,而不要只写其中一个。  Hashtable是同步的。HashMap类  HashMap和Hashtable类似,不同之处在于HashMap是非同步的,并且允许null,即null value和null key。,但是将HashMap视为Collection时(values()方法可返回Collection),其迭代子操作时间开销和HashMap的容量成比例。因此,如果迭代操作的性能相当重要的话,不要将HashMap的初始化容量设得过高,或者load factor过低。WeakHashMap类  WeakHashMap是一种改进的HashMap,它对key实行“弱引用”,如果一个key不再被外部所引用,那么该key可以被GC回收。总结  如果涉及到堆栈,队列等操作,应该考虑用List,对于需要快速插入,删除元素,应该使用LinkedList,如果需要快速随机访问元素,应该使用ArrayList。  如果程序在单线程环境中,或者访问仅仅在一个线程中进行,考虑非同步的类,其效率较高,如果多个线程可能同时操作一个类,应该使用同步的类。  要特别注意对哈希表的操作,作为key的对象要正确复写equals和hashCode方法。  尽量返回接口而非实际的类型,如返回List而非ArrayList,这样如果以后需要将ArrayList换成LinkedList时,客户端代码不用改变。这就是针对抽象编程。同步性Vector是同步的。这个类中的一些方法保证了Vector中的对象是线程安全的。而ArrayList则是异步的,因此ArrayList中的对象并不是线程安全的。因为同步的要求会影响执行的效率,所以如果你不需要线程安全的集合那么使用ArrayList是一个很好的选择,这样可以避免由于同步带来的不必要的性能开销。数据增长从内部实现机制来讲ArrayList和Vector都是使用数组(Array)来控制集合中的对象。当你向这两种类型中增加元素的时候,如果元素的数目超出了内部数组目前的长度它们都需要扩展内部数组的长度,Vector缺省情况下自动增长原来一倍的数组长度,ArrayList是原来的50%,所以最后你获得的这个集合所占的空间总是比你实际需要的要大。所以如果你要在集合中保存大量的数据那么使用Vector有一些优势,因为你可以通过设置集合的初始化大小来避免不必要的资源开销。使用模式在ArrayList和Vector中,从一个指定的位置(通过索引)查找数据或是在集合的末尾增加、移除一个元素所花费的时间是一样的,这个时间我们用O(1)表示。但是,如果在集合的其他位置增加或移除元素那么花费的时间会呈线形增长:O(n-i),其中n代表集合中元素的个数,i代表元素增加或移除元素的索引位置。为什么会这样呢?以为在进行上述操作的时候集合中第i和第i个元素之后的所有元素都要执行位移的操作。这一切意味着什么呢?这意味着,你只是查找特定位置的元素或只在集合的末端增加、移除元素,那么使用Vector或ArrayList都可以。如果是其他操作,你最好选择其他的集合操作类。比如,LinkList集合类在增加或移除集合中任何位置的元素所花费的时间都是一样的?O(1),但它在索引一个元素的使用缺比较慢-O(i),其中i是索引的位置.使用ArrayList也很容易,因为你可以简单的使用索引来代替创建iterator对象的操作。LinkList也会为每个插入的元素创建对象,所有你要明白它也会带来额外的开销。最后,在《Practical Java》一书中Peter Haggar建议使用一个简单的数组(Array)来代替Vector或ArrayList。尤其是对于执行效率要求高的程序更应如此。因为使用数组(Array)避免了同步、额外的方法调用和不必要的重新分配空间的操作。

wangccsy 2019-12-02 01:48:37 0 浏览量 回答数 0

问题

为什么有的服务器无法选择Windows操作系统?

boxti 2019-12-01 21:49:53 1437 浏览量 回答数 0

问题

【算法】五分钟算法小知识:Linux的进程、线程、文件描述符是什么?

游客ih62co2qqq5ww 2020-05-09 11:28:57 0 浏览量 回答数 0

回答

numpy矩阵严格是二维的,而numpy数组(ndarrays)是N维的。矩阵对象是ndarray的子​​类,因此它们继承了ndarray的所有属性和方法。 numpy矩阵的主要优点是它们为矩阵乘法提供了一种方便的表示法:如果a和b是矩阵,则a * b是它们的矩阵乘积。 import numpy as np a=np.mat('4 3; 2 1') b=np.mat('1 2; 3 4') print(a) [[4 3] [2 1]] print(b) [[1 2] [3 4]] print(a*b) [[13 20] [ 5 8]] 另一方面,从Python 3.5开始,NumPy使用@运算符支持中缀矩阵乘法,因此您可以在Python> = 3.5中使用ndarrays实现相同的矩阵乘法便利。 import numpy as np a=np.array([[4, 3], [2, 1]]) b=np.array([[1, 2], [3, 4]]) print(a@b) [[13 20] [ 5 8]] 矩阵对象和ndarray都.T必须返回转置,但是矩阵对象也必须具有.H共轭转置和.I逆。 相反,numpy数组始终遵守以元素为单位应用操作的规则(除了new @运算符)。因此,如果a和b是numpy数组,则a*b该数组是通过按元素逐个乘以组成的: c=np.array([[4, 3], [2, 1]]) d=np.array([[1, 2], [3, 4]]) print(c*d) [[4 6] [6 4]] 要获得矩阵乘法的结果,请使用np.dot(或@在Python> = 3.5中,如上所示): print(np.dot(c,d)) [[13 20] [ 5 8]] 该**运营商还表现不同: print(a**2) [[22 15] [10 7]] print(c**2) [[16 9] [ 4 1]] 由于a是矩阵,所以a2返回矩阵乘积a*a。由于c是ndarray,因此c2返回一个ndarray,每个组件的元素均平方。 矩阵对象和ndarray之间还有其他技术区别(与np.ravel,项目选择和序列行为有关)。 numpy数组的主要优点是它们比二维矩阵更通用。当您需要3维数组时会发生什么?然后,您必须使用ndarray,而不是矩阵对象。因此,学习使用矩阵对象的工作量更大-您必须学习矩阵对象操作和ndarray操作。 编写同时使用矩阵和数组的程序会使您的生活变得困难,因为您必须跟踪变量是什么类型的对象,以免乘法返回意外的结果。 相反,如果仅使用ndarray,则可以执行矩阵对象可以执行的所有操作,以及更多操作,但功能/符号略有不同。 如果您愿意放弃NumPy矩阵产品表示法的视觉吸引力(使用python> = 3.5的ndarrays几乎可以优雅地实现),那么我认为NumPy数组绝对是可行的方法。 PS。当然,您真的不必以牺牲另一个为代价来选择一个,因为np.asmatrix并np.asarray允许您将一个转换为另一个(只要数组是二维的)。 问题来源于stack overflow

保持可爱mmm 2020-01-15 16:48:36 0 浏览量 回答数 0

回答

这个确实把死锁说的很清楚了,原来死锁是这么产生的,我问题中的死锁也确实是数据库的死锁 那对于死锁,我觉得是个碰巧出现的事情,觉着业务逻辑如果很复杂的话,还是很容易出现这种巧合的,比如innodb下一个业务逻辑1需要一个事务(会操作a,b两张表各自的某条记录)进行完成时候,完全有可能在操作进行到a表某条记录操作刚完成的时候,也就是正准备操作b表记录时; 突然间有另一条业务逻辑2请求被cpu切换到了(巧了,它也用事务并且先操作b表的同逻辑1的记录,再操作a表同逻辑1的记录),而他正好操作完b表的该条记录,准备请求这样目前被锁住的情况就导致逻辑一不能进行,逻辑二也不能进行! 理解的对么?那对于为什么并发会产生多卖我还没有清楚啊,如若按照你说的,cpu总会一个个的处理请求, 那处理每个请求的时候我都判断当前库存,根本不会出现超出库存的啊还有,您说的并发是一个一个请求进行处理 这是单cpu会出现的或者请求数大于cpu个数会出现的如果是cpu有5颗,只过来3个请求,每个请求都要操作a表的1记录,那还真有可能3颗cpu并行同时抓住a表的1记录,这样也是死锁么? 还是说,虽然cpu并行到达这条记录,但数据库只会允许一个个来加锁,即使同时到达,但mysql还是会排队,这并不算死锁?

a123456678 2019-12-02 02:59:53 0 浏览量 回答数 0
阿里云大学 云服务器ECS com域名 网站域名whois查询 开发者平台 小程序定制 小程序开发 国内短信套餐包 开发者技术与产品 云数据库 图像识别 开发者问答 阿里云建站 阿里云备案 云市场 万网 阿里云帮助文档 免费套餐 开发者工具 云栖号物联网 小程序开发制作 视频内容分析 企业网站制作 视频集锦 代理记账服务 2020阿里巴巴研发效能峰会 企业建站模板 云效成长地图 高端建站 云栖号弹性计算 阿里云云栖号 云栖号案例 云栖号直播