首页 文章 精选 留言 我的

精选列表

搜索[面试],共5094篇文章
优秀的个人博客,低调大师

BAT等大厂总结的前200页Java面试题都在这里了

内容较多,请大家耐心阅读 基本概念 操作系统中 heap 和 stack 的区别 什么是基于注解的切面实现 什么是 对象/关系 映射集成模块 什么是 Java 的反射机制 什么是 ACID BS与CS的联系与区别 Cookie 和 Session的区别 fail-fast 与 fail-safe 机制有什么区别 get 和 post请求的区别 Interface 与 abstract 类的区别 IOC的优点是什么 IO 和 NIO的区别,NIO优点 Java 8 / Java 7 为我们提供了什么新功能 什么是竞态条件? 举个例子说明。 JRE、JDK、JVM 及 JIT 之间有什么不同 MVC的各个部分都有那些技术来实现?如何实现? RPC 通信和 RMI 区别 什么是 Web Service(Web服务) JSWDL开发包的介绍。JAXP、JAXM的解释。SOAP、UDDI,WSDL解释。 WEB容器主要有哪些功能? 并请列出一些常见的WEB容器名字。 一个”.java”源文件中是否可以包含多个类(不是内部类)?有什么限制 简单说说你了解的类加载器。是否实现过类加载器 解释一下什么叫AOP(面向切面编程) 请简述 Servlet 的生命周期及其相关的方法 请简述一下 Ajax 的原理及实现步骤 简单描述Struts的主要功能 什么是 N 层架构 什么是CORBA?用途是什么 什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言” 什么是正则表达式?用途是什么?哪个包使用正则表达式来实现模式匹配 什么是懒加载(Lazy Loading) 什么是尾递归,为什么需要尾递归 什么是控制反转(Inversion of Control)与依赖注入(Dependency Injection) 关键字 finalize 什么是finalize()方法 finalize()方法什么时候被调用 析构函数(finalization)的目的是什么 final 和 finalize 的区别 final final关键字有哪些用法 final 与 static 关键字可以用于哪里?它们的作用是什么 final, finally, finalize的区别 final、finalize 和 finally 的不同之处? 能否在运行时向 static final 类型的赋值 使用final关键字修饰一个变量时,是引用不能变,还是引用的对象不能变 一个类被声明为final类型,表示了什么意思 throws, throw, try, catch, finally分别代表什么意义 Java 有几种修饰符?分别用来修饰什么 volatile volatile 修饰符的有过什么实践 volatile 变量是什么?volatile 变量和 atomic 变量有什么不同 volatile 类型变量提供什么保证?能使得一个非原子操作变成原子操作吗 能创建 volatile 数组吗? transient变量有什么特点 super什么时候使用 public static void 写成 static public void会怎样 说明一下public static void main(String args[])这段声明里每个关键字的作用 请说出作用域public, private, protected, 以及不写时的区别 sizeof 是Java 的关键字吗 欢迎工作一到五年的Java工程师朋友们加入Java填坑之路:860113481 群内提供免费的Java架构学习资料(里面有高可用、高并发、高性能及分布式、Jvm性能调优、Spring源码,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多个知识点的架构资料)合理利用自己每一分每一秒的时间来学习提升自己,不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代! static static class 与 non static class的区别 static 关键字是什么意思?Java中是否可以覆盖(override)一个private或者是static的方法 静态类型有什么特点 main() 方法为什么必须是静态的?能不能声明 main() 方法为非静态 是否可以从一个静态(static)方法内部发出对非静态(non-static)方法的调用 静态变量在什么时候加载?编译期还是运行期?静态代码块加载的时机呢 成员方法是否可以访问静态变量?为什么静态方法不能访问成员变量 switch switch 语句中的表达式可以是什么类型数据 switch 是否能作用在byte 上,是否能作用在long 上,是否能作用在String上 while 循环和 do 循环有什么不同 操作符 &操作符和&&操作符有什么区别? a = a + b 与 a += b 的区别? 逻辑操作符 (&,|,^)与条件操作符(&&,||)的区别 3*0.1 == 0.3 将会返回什么?true 还是 false? float f=3.4; 是否正确? short s1 = 1; s1 = s1 + 1;有什么错? 数据结构 基础类型(Primitives) 基础类型(Primitives)与封装类型(Wrappers)的区别在哪里 简述九种基本数据类型的大小,以及他们的封装类 int 和 Integer 哪个会占用更多的内存? int 和 Integer 有什么区别?parseInt()函数在什么时候使用到 float和double的默认值是多少 如何去小数四舍五入保留小数点后两位 char 型变量中能不能存贮一个中文汉字,为什么 类型转换 怎样将 bytes 转换为 long 类型 怎么将 byte 转换为 String 如何将数值型字符转换为数字 我们能将 int 强制转换为 byte 类型的变量吗?如果该值大于 byte 类型的范围,将会出现什么现象 能在不进行强制转换的情况下将一个 double 值赋值给 long 类型的变量吗 类型向下转换是什么 数组 如何权衡是使用无序的数组还是有序的数组 怎么判断数组是 null 还是为空 怎么打印数组? 怎样打印数组中的重复元素 Array 和 ArrayList有什么区别?什么时候应该使用Array而不是ArrayList 数组和链表数据结构描述,各自的时间复杂度 数组有没有length()这个方法? String有没有length()这个方法 队列 队列和栈是什么,列出它们的区别 BlockingQueue是什么 简述 ConcurrentLinkedQueue LinkedBlockingQueue 的用处和不同之处。 ArrayList、Vector、LinkedList的存储性能和特性 String StringBuffer ByteBuffer 与 StringBuffer有什么区别 HashMap HashMap的工作原理是什么 内部的数据结构是什么 HashMap 的 table的容量如何确定?loadFactor 是什么? 该容量如何变化?这种变化会带来什么问题? HashMap 实现的数据结构是什么?如何实现 HashMap 和 HashTable、ConcurrentHashMap 的区别 HashMap的遍历方式及效率 HashMap、LinkedMap、TreeMap的区别 如何决定选用HashMap还是TreeMap 如果HashMap的大小超过了负载因子(load factor)定义的容量,怎么办 HashMap 是线程安全的吗?并发下使用的 Map 是什么,它们内部原理分别是什么,比如存储方式、 hashcode、扩容、 默认容量等 HashSet HashSet和TreeSet有什么区别 HashSet 内部是如何工作的 WeakHashMap 是怎么工作的? Set Set 里的元素是不能重复的,那么用什么方法来区分重复与否呢?是用 == 还是 equals()? 它们有何区别? TreeMap:TreeMap 是采用什么树实现的?TreeMap、HashMap、LindedHashMap的区别。TreeMap和TreeSet在排序时如何比较元素?Collections工具类中的sort()方法如何比较元素? TreeSet:一个已经构建好的 TreeSet,怎么完成倒排序。 EnumSet 是什么 Hash算法 Hashcode 的作用 简述一致性 Hash 算法 有没有可能 两个不相等的对象有相同的 hashcode?当两个对象 hashcode 相同怎么办?如何获取值对象 为什么在重写 equals 方法的时候需要重写 hashCode 方法?equals与 hashCode 的异同点在哪里 a.hashCode() 有什么用?与 a.equals(b) 有什么关系 hashCode() 和 equals() 方法的重要性体现在什么地方 Object:Object有哪些公用方法?Object类hashcode,equals 设计原则? sun为什么这么设计?Object类的概述 如何在父类中为子类自动完成所有的 hashcode 和 equals 实现?这么做有何优劣。 可以在 hashcode() 中使用随机数字吗? LinkedHashMap LinkedHashMap 和 PriorityQueue 的区别是什么 List List, Set, Map三个接口,存取元素时各有什么特点 List, Set, Map 是否继承自 Collection 接口 遍历一个 List 有哪些不同的方式 LinkedList LinkedList 是单向链表还是双向链表 LinkedList 与 ArrayList 有什么区别 描述下 Java 中集合(Collections),接口(Interfaces),实现(Implementations)的概念。LinkedList 与 ArrayList 的区别是什么? 插入数据时,ArrayList, LinkedList, Vector谁速度较快? ArrayList ArrayList 和 HashMap 的默认大小是多数 ArrayList 和 LinkedList 的区别,什么时候用 ArrayList? ArrayList 和 Set 的区别? ArrayList, LinkedList, Vector的区别 ArrayList是如何实现的,ArrayList 和 LinkedList 的区别 ArrayList如何实现扩容 Array 和 ArrayList 有何区别?什么时候更适合用Array 说出ArraList,Vector, LinkedList的存储性能和特性 Map Map, Set, List, Queue, Stack Map 接口提供了哪些不同的集合视图 为什么 Map 接口不继承 Collection 接口 Collections 介绍Java中的Collection FrameWork。集合类框架的基本接口有哪些 Collections类是什么?Collection 和 Collections的区别?Collection、Map的实现 集合类框架的最佳实践有哪些 为什么 Collection 不从 Cloneable 和 Serializable 接口继承 说出几点 Java 中使用 Collections 的最佳实践? Collections 中 遗留类 (HashTable、Vector) 和 现有类的区别 什么是 B+树,B-树,列出实际的使用场景。 接口 Comparator 与 Comparable 接口是干什么的?列出它们的区别 对象 拷贝(clone) 如何实现对象克隆 深拷贝和浅拷贝区别 深拷贝和浅拷贝如何实现激活机制 写clone()方法时,通常都有一行代码,是什么 比较 在比较对象时,”==” 运算符和 equals 运算有何区别 如果要重写一个对象的equals方法,还要考虑什么 两个对象值相同(x.equals(y) == true),但却可有不同的hash code,这句话对不对 构造器 构造器链是什么 创建对象时构造器的调用顺序 不可变对象 什么是不可变象(immutable object) 为什么 Java 中的 String 是不可变的(Immutable) 如何构建不可变的类结构?关键点在哪里 能创建一个包含可变对象的不可变对象吗 如何对一组对象进行排序 方法 构造器(constructor)是否可被重写(override) 方法可以同时即是 static 又是 synchronized 的吗 abstract 的 method是否可同时是 static,是否可同时是 native,是否可同时是synchronized Java支持哪种参数传递类型 一个对象被当作参数传递到一个方法,是值传递还是引用传递 当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递 我们能否重载main()方法 如果main方法被声明为private会怎样 GC 概念 GC是什么?为什么要有GC 什么时候会导致垃圾回收 GC是怎么样运行的 新老以及永久区是什么 GC 有几种方式?怎么配置 什么时候一个对象会被GC? 如何判断一个对象是否存活 System.gc() Runtime.gc()会做什么事情? 能保证 GC 执行吗 垃圾回收器可以马上回收内存吗?有什么办法主动通知虚拟机进行垃圾回收? Minor GC 、Major GC、Young GC 与 Full GC分别在什么时候发生 垃圾回收算法的实现原理 如果对象的引用被置为null,垃圾收集器是否会立即释放对象占用的内存? 垃圾回收的最佳做法是什么 GC收集器有哪些 垃圾回收器的基本原理是什么? 串行(serial)收集器和吞吐量(throughput)收集器的区别是什么 Serial 与 Parallel GC之间的不同之处 CMS 收集器 与 G1 收集器的特点与区别 CMS垃圾回收器的工作过程 JVM 中一次完整的 GC 流程是怎样的? 对象如何晋升到老年代 吞吐量优先和响应优先的垃圾收集器选择 GC策略 举个实际的场景,选择一个GC策略 JVM的永久代中会发生垃圾回收吗 收集方法 标记清除、标记整理、复制算法的原理与特点?分别用在什么地方 如果让你优化收集方法,有什么思路 JVM 参数 说说你知道的几种主要的jvm 参数 -XX:+UseCompressedOops 有什么作用 类加载器(ClassLoader) Java 类加载器都有哪些 JVM如何加载字节码文件 内存管理 JVM内存分哪几个区,每个区的作用是什么 一个对象从创建到销毁都是怎么在这些部分里存活和转移的 解释内存中的栈(stack)、堆(heap)和方法区(method area)的用法 JVM中哪个参数是用来控制线程的栈堆栈小 简述内存分配与回收策略 简述重排序,内存屏障,happen-before,主内存,工作内存 Java中存在内存泄漏问题吗?请举例说明 简述 Java 中软引用(SoftReferenc)、弱引用(WeakReference)和虚引用 内存映射缓存区是什么 jstack,jstat,jmap,jconsole怎么用 32 位 JVM 和 64 位 JVM 的最大堆内存分别是多数?32 位和 64 位的 JVM,int 类型变量的长度是多数? 怎样通过 Java 程序来判断 JVM 是 32 位 还是 64 位 JVM自身会维护缓存吗?是不是在堆中进行对象分配,操作系统的堆还是JVM自己管理堆 什么情况下会发生栈内存溢出 双亲委派模型是什么 多线程 基本概念 什么是线程 多线程的优点 多线程的几种实现方式 用 Runnable 还是 Thread 什么是线程安全 Vector, SimpleDateFormat 是线程安全类吗 什么 Java 原型不是线程安全的 哪些集合类是线程安全的 多线程中的忙循环是什么 如何创建一个线程 编写多线程程序有几种实现方式 什么是线程局部变量 线程和进程有什么区别?进程间如何通讯,线程间如何通讯 什么是多线程环境下的伪共享(false sharing) 同步和异步有何异同,在什么情况下分别使用他们?举例说明 Current ConcurrentHashMap 和 Hashtable的区别 ArrayBlockingQueue, CountDownLatch的用法 ConcurrentHashMap的并发度是什么 CyclicBarrier 和 CountDownLatch有什么不同?各自的内部原理和用法是什么 Semaphore的用法 Thread 启动一个线程是调用 run() 还是 start() 方法?start() 和 run() 方法有什么区别 调用start()方法时会执行run()方法,为什么不能直接调用run()方法 sleep() 方法和对象的 wait() 方法都可以让线程暂停执行,它们有什么区别 yield方法有什么作用?sleep() 方法和 yield() 方法有什么区别 Java 中如何停止一个线程 stop() 和 suspend() 方法为何不推荐使用 如何在两个线程间共享数据 如何强制启动一个线程 如何让正在运行的线程暂停一段时间 什么是线程组,为什么在Java中不推荐使用 你是如何调用 wait(方法的)?使用 if 块还是循环?为什么 生命周期 有哪些不同的线程生命周期 线程状态,BLOCKED 和 WAITING 有什么区别 画一个线程的生命周期状态图 ThreadLocal 用途是什么,原理是什么,用的时候要注意什么 ThreadPool 线程池是什么?为什么要使用它 如何创建一个Java线程池 ThreadPool用法与优势 提交任务时,线程池队列已满时会发会生什么 newCache 和 newFixed 有什么区别?简述原理。构造函数的各个参数的含义是什么,比如 coreSize, maxsize 等 线程池的实现策略 线程池的关闭方式有几种,各自的区别是什么 线程池中submit() 和 execute()方法有什么区别? 线程调度 Java中用到的线程调度算法是什么 什么是多线程中的上下文切换 你对线程优先级的理解是什么 什么是线程调度器 (Thread Scheduler) 和时间分片 (Time Slicing) 线程同步 请说出你所知的线程同步的方法 synchronized 的原理是什么 synchronized 和 ReentrantLock 有什么不同 什么场景下可以使用 volatile 替换 synchronized 有T1,T2,T3三个线程,怎么确保它们按顺序执行?怎样保证T2在T1执行完后执行,T3在T2执行完后执行 同步块内的线程抛出异常会发生什么 当一个线程进入一个对象的 synchronized 方法A 之后,其它线程是否可进入此对象的 synchronized 方法B 使用 synchronized 修饰静态方法和非静态方法有什么区别 如何从给定集合那里创建一个 synchronized 的集合 锁 Java Concurrency API 中 的 Lock 接口是什么?对比同步它有什么优势 Lock 与 Synchronized 的区别?Lock 接口比 synchronized 块的优势是什么 ReadWriteLock是什么? 锁机制有什么用 什么是乐观锁(Optimistic Locking)?如何实现乐观锁?如何避免ABA问题 解释以下名词:重排序,自旋锁,偏向锁,轻量级锁,可重入锁,公平锁,非公平锁,乐观锁,悲观锁 什么时候应该使用可重入锁 简述锁的等级方法锁、对象锁、类锁 Java中活锁和死锁有什么区别? 什么是死锁(Deadlock)?导致线程死锁的原因?如何确保 N 个线程可以访问 N 个资源同时又不导致死锁 死锁与活锁的区别,死锁与饥饿的区别 怎么检测一个线程是否拥有锁 如何实现分布式锁 有哪些无锁数据结构,他们实现的原理是什么 读写锁可以用于什么应用场景 Executors类是什么? Executor和Executors的区别 什么是Java线程转储(Thread Dump),如何得到它 如何在Java中获取线程堆栈 说出 3 条在 Java 中使用线程的最佳实践 在线程中你怎么处理不可捕捉异常 实际项目中使用多线程举例。你在多线程环境中遇到的常见的问题是什么?你是怎么解决它的 请说出与线程同步以及线程调度相关的方法 程序中有3个 socket,需要多少个线程来处理 假如有一个第三方接口,有很多个线程去调用获取数据,现在规定每秒钟最多有 10 个线程同时调用它,如何做到 如何在 Windows 和 Linux 上查找哪个线程使用的 CPU 时间最长 如何确保 main() 方法所在的线程是 Java 程序最后结束的线程 非常多个线程(可能是不同机器),相互之间需要等待协调才能完成某种工作,问怎么设计这种协调方案 你需要实现一个高效的缓存,它允许多个用户读,但只允许一个用户写,以此来保持它的完整性,你会怎样去实现它 异常 基本概念 Error 和 Exception有什么区别 UnsupportedOperationException是什么 NullPointerException 和 ArrayIndexOutOfBoundException 之间有什么相同之处 什么是受检查的异常,什么是运行时异常 运行时异常与一般异常有何异同 简述一个你最常见到的runtime exception(运行时异常) finally finally关键词在异常处理中如何使用 如果执行finally代码块之前方法返回了结果,或者JVM退出了,finally块中的代码还会执行吗 try里有return,finally还执行么?那么紧跟在这个try后的finally {}里的code会不会被执行,什么时候被执行,在return前还是后 在什么情况下,finally语句不会执行 throw 和 throws 有什么区别? OOM你遇到过哪些情况?你是怎么搞定的? SOF你遇到过哪些情况? 既然我们可以用RuntimeException来处理错误,那么你认为为什么Java中还存在检查型异常 当自己创建异常类的时候应该注意什么 导致空指针异常的原因 异常处理 handle or declare 原则应该如何理解 怎么利用 JUnit 来测试一个方法的异常 catch块里别不写代码有什么问题 你曾经自定义实现过异常吗?怎么写的 什么是 异常链 在try块中可以抛出异常吗 JDBC 通过 JDBC 连接数据库有哪几种方式 阐述 JDBC 操作数据库的基本步骤 JDBC 中如何进行事务处理 什么是 JdbcTemplate 什么是 DAO 模块 使用 JDBC 操作数据库时,如何提升读取数据的性能?如何提升更新数据的性能 列出 5 个应该遵循的 JDBC 最佳实践 IO File File类型中定义了什么方法来创建一级目录 File类型中定义了什么方法来判断一个文件是否存在 流 为了提高读写性能,可以采用什么流 Java中有几种类型的流 JDK 为每种类型的流提供了一些抽象类以供继承,分别是哪些类 对文本文件操作用什么I/O流 对各种基本数据类型和String类型的读写,采用什么流 能指定字符编码的 I/O 流类型是什么 序列化 什么是序列化?如何实现 Java 序列化及注意事项 Serializable 与 Externalizable 的区别 Socket socket 选项 TCP NO DELAY 是指什么 Socket 工作在 TCP/IP 协议栈是哪一层 TCP、UDP 区别及 Java 实现方式 说几点 IO 的最佳实践 直接缓冲区与非直接缓冲器有什么区别? 怎么读写 ByteBuffer?ByteBuffer 中的字节序是什么 当用System.in.read(buffer)从键盘输入一行n个字符后,存储在缓冲区buffer中的字节数是多少 如何使用扫描器类(Scanner Class)令牌化 面向对象编程(OOP) 解释下多态性(polymorphism),封装性(encapsulation),内聚(cohesion)以及耦合(coupling) 多态的实现原理 封装、继承和多态是什么 对象封装的原则是什么? 类 获得一个类的类对象有哪些方式 重载(Overload)和重写(Override)的区别。重载的方法能否根据返回类型进行区分? 说出几条 Java 中方法重载的最佳实践 抽象类 抽象类和接口的区别 抽象类中是否可以有静态的main方法 抽象类是否可实现(implements)接口 抽象类是否可继承具体类(concrete class) 匿名类(Anonymous Inner Class) 匿名内部类是否可以继承其它类?是否可以实现接口 内部类 内部类分为几种 内部类可以引用它的包含类(外部类)的成员吗 请说一下 Java 中为什么要引入内部类?还有匿名内部类 继承 继承(Inheritance)与聚合(Aggregation)的区别在哪里 继承和组合之间有什么不同 为什么类只能单继承,接口可以多继承 存在两个类,B 继承 A,C 继承 B,能将 B 转换为 C 么?如 C = (C) B 如果类 a 继承类 b,实现接口c,而类 b 和接口 c 中定义了同名变量,请问会出现什么问题 接口 接口是什么 接口是否可继承接口 为什么要使用接口而不是直接使用具体类?接口有什么优点 泛型 泛型的存在是用来解决什么问题 泛型的常用特点 List能否转为List 工具类 日历 Calendar Class的用途 如何在Java中获取日历类的实例 解释一些日历类中的重要方法 GregorianCalendar 类是什么 SimpleTimeZone 类是什么 Locale类是什么 如何格式化日期对象 如何添加小时(hour)到一个日期对象(Date Objects) 如何将字符串 YYYYMMDD 转换为日期 Math Math.round()什么作用?Math.round(11.5) 等于多少?Math.round(-11.5)等于多少? XML XML文档定义有几种形式?它们之间有何本质区别?解析XML文档有哪几种方式?DOM 和 SAX 解析器有什么不同? Java解析XML的方式 用 jdom 解析 xml 文件时如何解决中文问题?如何解析 你在项目中用到了 XML 技术的哪些方面?如何实现 动态代理 描述动态代理的几种实现方式,分别说出相应的优缺点 设计模式 什么是设计模式(Design Patterns)?你用过哪种设计模式?用在什么场合 你知道哪些商业级设计模式? 哪些设计模式可以增加系统的可扩展性 单例模式 除了单例模式,你在生产环境中还用过什么设计模式? 写 Singleton 单例模式 单例模式的双检锁是什么 如何创建线程安全的 Singleton 什么是类的单例模式 写出三种单例模式实现 适配器模式 适配器模式是什么?什么时候使用 适配器模式和代理模式之前有什么不同 适配器模式和装饰器模式有什么区别 什么时候使用享元模式 什么时候使用组合模式 什么时候使用访问者模式 什么是模板方法模式 请给出1个符合开闭原则的设计模式的例子 开放问题 用一句话概括 Web 编程的特点 Google是如何在一秒内把搜索结果返回给用户 哪种依赖注入方式你建议使用,构造器注入,还是 Setter方法注入 树(二叉或其他)形成许多普通数据结构的基础。请描述一些这样的数据结构以及何时可以使用它们 某一项功能如何设计 线上系统突然变得异常缓慢,你如何查找问题 什么样的项目不适合用框架 新浪微博是如何实现把微博推给订阅者 简要介绍下从浏览器输入 URL 开始到获取到请求界面之后 Java Web 应用中发生了什么 请你谈谈SSH整合 高并发下,如何做到安全的修改同一行数据 12306网站的订票系统如何实现,如何保证不会票不被超卖 网站性能优化如何优化的 聊了下曾经参与设计的服务器架构 请思考一个方案,实现分布式环境下的 countDownLatch 请思考一个方案,设计一个可以控制缓存总体大小的自动适应的本地缓存 在你的职业生涯中,算得上最困难的技术挑战是什么 如何写一篇设计文档,目录是什么 大写的O是什么?举几个例子 编程中自己都怎么考虑一些设计原则的,比如开闭原则,以及在工作中的应用 解释一下网络应用的模式及其特点 设计一个在线文档系统,文档可以被编辑,如何防止多人同时对同一份文档进行编辑更新 说出数据连接池的工作机制是什么 怎么获取一个文件中单词出现的最高频率 描述一下你最常用的编程风格 如果有机会重新设计你们的产品,你会怎么做 如何搭建一个高可用系统 如何启动时不需输入用户名与密码 如何在基于Java的Web项目中实现文件上传和下载 如何实现一个秒杀系统,保证只有几位用户能买到某件商品。 如何实现负载均衡,有哪些算法可以实现 如何设计一个购物车?想想淘宝的购物车如何实现的 如何设计一套高并发支付方案,架构如何设计 如何设计建立和保持 100w 的长连接 如何避免浏览器缓存。 如何防止缓存雪崩 如果AB两个系统互相依赖,如何解除依 如果有人恶意创建非法连接,怎么解决 如果有几十亿的白名单,每天白天需要高并发查询,晚上需要更新一次,如何设计这个功能 如果系统要使用超大整数(超过long长度范围),请你设计一个数据结构来存储这种超大型数字以及设计一种算法来实现超大整数加法运算) 如果要设计一个图形系统,请你设计基本的图形元件(Point,Line,Rectangle,Triangle)的简单实现 如果让你实现一个并发安全的链表,你会怎么做 应用服务器与WEB 服务器的区别?应用服务器怎么监控性能,各种方式的区别?你使用过的应用服务器优化技术有哪些 大型网站在架构上应当考虑哪些问题 有没有处理过线上问题?出现内存泄露,CPU利用率标高,应用无响应时如何处理的 最近看什么书,印象最深刻的是什么 描述下常用的重构技巧 你使用什么版本管理工具?分支(Branch)与标签(Tag)之间的区别在哪里 你有了解过存在哪些反模式(Anti-Patterns)吗 你用过的网站前端优化的技术有哪些 如何分析Thread dump 你如何理解AOP中的连接点(Joinpoint)、切点(Pointcut)、增强(Advice)、引介(Introduction)、织入(Weaving)、切面(Aspect)这些概念 你是如何处理内存泄露或者栈溢出问题的 你们线上应用的 JVM 参数有哪些 怎么提升系统的QPS和吞吐量 知识面 解释什么是 MESI 协议(缓存一致性) 谈谈 reactor 模型 Java 9 带来了怎样的新功能 Java 与 C++ 对比,C++ 或 Java 中的异常处理机制的简单原理和应用 简单讲讲 Tomcat 结构,以及其类加载器流程 虚拟内存是什么 阐述下 SOLID 原则 请简要讲一下你对测试驱动开发(TDD)的认识 CDN实现原理 Maven 和 ANT 有什么区别 UML中有哪些常用的图 Linux Linux 下 IO 模型有几种,各自的含义是什么。 Linux 系统下你关注过哪些内核参数,说说你知道的 Linux 下用一行命令查看文件的最后五行 平时用到哪些 Linux 命令 用一行命令输出正在运行的 Java 进程 使用什么命令来确定是否有 Tomcat 实例运行在机器上 什么是 N+1 难题 什么是 paxos 算法 什么是 restful,讲讲你理解的 restful 什么是 zab 协议 什么是领域模型(domain model)?贫血模型(anaemic domain model) 和充血模型(rich domain model)有什么区别 什么是领域驱动开发(Domain Driven Development) 介绍一下了解的 Java 领域的 Web Service 框架 Web Server、Web Container 与 Application Server 的区别是什么 微服务(MicroServices)与巨石型应用(Monolithic Applications)之间的区别在哪里 描述 Cookie 和 Session 的作用,区别和各自的应用范围,Session工作原理 你常用的持续集成(Continuous Integration)、静态代码分析(Static Code Analysis)工具有哪些 简述下数据库正则化(Normalizations) KISS,DRY,YAGNI 等原则是什么含义 分布式事务的原理,优缺点,如何使用分布式事务? 布式集群下如何做到唯一序列号 网络 HTTPS 的加密方式是什么,讲讲整个加密解密流程 HTTPS和HTTP的区别 HTTP连接池实现原理 HTTP集群方案 Nginx、lighttpd、Apache三大主流 Web服务器的区别 是否看过框架的一些代码 持久层设计要考虑的问题有哪些?你用过的持久层框架有哪些 数值提升是什么 你能解释一下里氏替换原则吗 你是如何测试一个应用的?知道哪些测试框架 传输层常见编程协议有哪些?并说出各自的特点 编程题 计算加班费 加班10小时以下加班费是时薪的1.5倍。加班10小时或以上,按4元/时算。提示:(一个月工作26天,一天正常工作8小时) 计算1000月薪,加班9小时的加班费 计算2500月薪,加班11小时的加班费 计算1000月薪,加班15小时的加班费 卖东西 一家商场有红苹果和青苹果出售。(红苹果5元/个,青苹果4元/个)。 模拟一个进货。红苹果跟青苹果各进200个。 模拟一个出售。红苹果跟青苹果各买出10个。每卖出一个苹果需要进行统计。 提示:一个苹果是一个单独的实体。 日期提取 有这样一个时间字符串:2008-8-8 20:08:08 , 请编写能够匹配它的正则表达式,并编写Java代码将日期后面的时分秒提取出来,即:20:08:08 线程 8设计4个线程,其中两个线程每次对j增加1,另外两个线程对j每次减少1。写出程序。 用Java写一个多线程程序,如写四个线程,二个加1,二个对一个变量减一,输出 wait-notify 写一段代码来解决生产者-消费者问题 数字 判断101-200之间有多少个素数,并输出所有素数 用最有效率的方法算出2乘以17等于多少 有 1 亿个数字,其中有 2 个是重复的,快速找到它,时间和空间要最优 2 亿个随机生成的无序整数,找出中间大小的值 10 亿个数字里里面找最小的 10 个 1到1亿的自然数,求所有数的拆分后的数字之和,如286 拆分成2、8、6,如1到11拆分后的数字之和 => 1 + … + 9 + 1 + 0 + 1 + 1 一个数如果恰好等于它的因子之和,这个数就称为 “完数 “。例如6=1+2+3.编程 找出1000以内的所有完数 一个数组中所有的元素都出现了三次,只有一个元素出现了一次找到这个元素 一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在 第10次落地时,共经过多少米?第10次反弹多高? 求100-1000内质数的和 求1到100的和的平均数 求s=a+a+aaa+aaaa+aa…a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加有键盘控制。 求出1到100的和 算出1到40的质数,放进数组里 显示放组里的数 找出第[5]个数 删除第[9]个数,再显示删除后的第[9]个 有 3n+1 个数字,其中 3n 个中是重复的,只有 1 个是不重复的,怎么找出来。 有一组数1.1.2.3.5.8.13.21.34。写出程序随便输入一个数就能给出和前一组数字同规律的头5个数 计算指定数字的阶乘 开发 Fizz Buzz 给定一个包含 N 个整数的数组,找出丢失的整数 一个排好序的数组,找出两数之和为m的所有组合 将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。 打印出所有的 “水仙花数 “,所谓 “水仙花数 “是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个 “水仙花数 “,因为153=1的三次方+5的三次方+3的三次方 原地交换两个变量的值 找出4字节整数的中位数 找到整数的平方根 实现斐波那契 网络 用Java Socket编程,读服务器几个字符,再写入本地显示 反射 反射机制提供了什么功能? 反射是如何实现的 哪里用到反射机制 反射中 Class.forName 和 ClassLoader 区别 反射创建类实例的三种方式是什么 如何通过反射调用对象的方法 如何通过反射获取和设置对象私有字段的值 反射机制的优缺点 数据库 写一段 JDBC 连Oracle的程序,并实现数据查询 算法 50个人围坐一圈,当数到三或者三的倍数出圈,问剩下的人是谁,原来的位置是多少 实现一个电梯模拟器用 写一个冒泡排序 写一个折半查找 随机产生20个不能重复的字符并排序 写一个函数,传入 2 个有序的整数数组,返回一个有序的整数数组 写一段代码在遍历 ArrayList 时移除一个元素 古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第四个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少 约瑟芬环游戏 正则 请编写一段匹配IP地址的正则表达式 写出一个正则表达式来判断一个字符串是否是一个数字 字符串 写一个方法,入一个文件名和一个字符串,统计这个字符串在这个文件中出现的次数。 写一个程序找出所有字符串的组合,并检查它们是否是回文串 写一个字符串反转函数,输入abcde转换成edcba代码 小游戏,倒转句子中的单词 将GB2312编码的字符串转换为ISO-8859-1编码的字符串 请写一段代码来计算给定文本内字符“A”的个数。分别用迭代和递归两种方式 编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。 但是要保证汉字不被截半个,如“我ABC”4,应该截为“我AB”,输入“我ABC汉DEF”,6,应该输出为“我ABC”而不是“我ABC+汉的半个” 给定 2 个包含单词列表(每行一个)的文件,编程列出交集 打印出一个字符串的所有排列 将一个键盘输入的数字转化成中文输出(例如:输入1234567,输出:一百二拾三万四千五百六拾七) 在Web应用开发过程中经常遇到输出某种编码的字符,如从 GBK 到 ISO8859-1等,如何输出一个某种编码的字符串 日期 计算两个日期之间的差距 欢迎工作一到五年的Java工程师朋友们加入Java填坑之路:860113481 群内提供免费的Java架构学习资料(里面有高可用、高并发、高性能及分布式、Jvm性能调优、Spring源码,MyBatis,Netty,Redis,Kafka,Mysql,Zookeeper,Tomcat,Docker,Dubbo,Nginx等多个知识点的架构资料)合理利用自己每一分每一秒的时间来学习提升自己,不要再用"没有时间“来掩饰自己思想上的懒惰!趁年轻,使劲拼,给未来的自己一个交代!

优秀的个人博客,低调大师

python基础(81道题)面试题,再也不用为没有答案发愁了

1、为什么学习Python? 人生苦短....哈哈,自己想吧!!! 2、通过什么途径学习的Python? 官网、网上视频、学习网站 3、Python和Java、PHP、C、C#、C++等其他语言的对比? 1、python代码,简介,明确,优雅,简单易懂2、开发效率高3、可扩展性强 4、简述解释型和编译型编程语言? 解释型:在执行程序时,计算机才一条一条的将代码解释成机器语言给计算机来执行编译型:是把源程序的每一条语句都编译成机器语言,并保存成二进制文件,这样计算机运行该程序时可以直接以机器语言来运行此程序,运行速度很快。 5、Python解释器种类以及特点? Cpython,IPython,Jpython,pypy,IronpythonPython是一门解释器语言,代码想运行,必须通过解释器执行,Python存在多种解释器,分别基于不同语言开发,每个解释器有不同的特点,但都能正常运行Python代码,以下是常用的五种Python解释器: CPython:当 从Python官方网站下载并安装好Python2.7后,就直接获得了一个官方版本的解 释器:Cpython,这个解释器是用C语言开发的,所以叫 CPython,在命名行下运行python, 就是启动CPython解释器,CPython是使用最广的Python解释器。 IPython:IPython是基于CPython之上的一个交互式解释器,也就是说,IPython只是在交互方 式上有所增强,但是执行Python代码的功能和CPython是完全一样的,好比很多国产浏览器 虽然外观不同,但内核其实是调用了IE。 PyPy:PyPy是另一个Python解释器,它的目标是执行速度,PyPy采用JIT技术, 对Python代进行动态编译,所以可以显著提高 Python代码的执行速度。 Jython:Jython是运行在Java平台上的Python解释器,可以直接把Python代码编译成Java字节码执行。 IronPython:IronPython和Jython类似,只不过IronPython是运行在微软.Net平台上的Python解释器, 可以直接把Python代码编译成.Net的字节码。 在Python的解释器中,使用广泛的是CPython,对于Python的编译,除了可以采用以上解释器 进行编译外,技术高超的开发者还可以按照自己的需求自行编写Python解释器来执行Python代码,十分的方便! 6、位和字节的关系? 一个字节=8位 7、b、B、KB、MB、GB 的关系? 1B(字节) = 8b(位)1KB = 1024B1MB = 1024KB1GB = 1024MB 8、请至少列举5个 PEP8 规范 1、缩进:每一级4个缩进。连续跨行应该使用圆括号或大括号或者使用悬挂缩进。 2、代码长度约束 一行列数:PEP8 规定最大为79列,如果拼接url很容易超限 一个函数:不可以超过30行;直观来讲就是完整显示一个函数一个屏幕就够了,不需要上下拖动 一个类:不要超过200行代码,不要超过10个方法 一个模块:不要超过500行 3、import 不要在一句import中引用多个库 4、命名规范 5、注释 总体原则,错误的注释不如没有注释。所以当一段代码发生变化时,第一件事就是要修改注释! 9、通过代码实现如下转换: 答案: 二进制转换成十进制:v = “0b1111011” print(int('0b1111011',2)) 十进制转换成二进制:v = 18 print(bin(18)) 八进制转换成十进制:v = “011” print(int('011',8)) 十进制转换成八进制:v = 30 print(oct(30)) 十六进制转换成十进制:v = “0x12” print(int('0x12',16)) 十进制转换成十六进制:v = 87 print(hex(87)) 10、请编写一个函数实现将IP地址转换成一个整数。 如 10.3.9.12 转换规则为: 10 00001010 3 00000011 9 00001001 12 00001100 再将以上二进制拼接起来计算十进制结果:00001010 00000011 00001001 00001100 = ? 答案: def func(x): lis = x.strip().split('.') li = [bin(int(i)) for i in lis] li2 = [i.replace('0b',(10-len(i))*'0') for i in li] return int(''.join(li2),2) ret = func('10.3.9.12') print(ret) 11、python递归的最大层数? 一般计算机默认的最大递归深度在1000左右,python最大递归深度一般在4000左右,跟计算 机的性能有关系,这个数不是一个定数,可通过一下方式测试 import sys print(sys.getrecursionlimit()) print(sys.setrecursionlimit(10000)) 12、求结果: v1 = 1 or 3 -------------->1v2 = 1 and 3-------------->3v3 = 0 and 2 and 1-------->0v4 = 0 and 2 or 1--------->1v5 = 0 and 2 or 1 or 4---->1v6 = 0 or Flase and 1----->False 13、ascii、unicode、utf-8、gbk 区别? ASCII码:使用一个字节编码,所以它的范围基本是只有英文字母、数字和一些特殊符号 ,只有256个字符。Unicode:能够表示全世界所有的字节GBK:是只用来编码汉字的,GBK全称《汉字内码扩展规范》,使用双字节编码。UTF-8:是一种针对Unicode的可变长度字符编码,又称万国码。 14、字节码和机器码的区别? 机器码:是电脑CPU直接读取运行的机器指令,运行速度最快,但是非常晦涩难懂字节码:是一种中间状态(中间码)的二进制代码(文件)。需要直译器转译后才能成为机器码。 15、三元运算规则以及应用场景? 规则:为真时的结果 if 判定条件 else 为假时的结果 ```应用场景:在赋值变量的时候,可以直接加判断,然后赋值` 16、列举 Python2和Python3的区别? 1、默认编码:2-->ascii,3-->utf-8 2、print的区别:python2中print是一个语句,不论想输出什么,直接放到print关键字后面即可。python3里,print()是一个函数, 像其他函数一样,print()需要你将要输出的东西作为参数传给它。 3、input的区别: python2有两个全局函数,用在命令行请求用户输入。第一个叫input(),它等待用户输入一个python表达式(然后返回结果)。 第二个叫做raw_input(),用户输入什么他就返回什么。python3 通过input替代了他们。 4、字符串:python2中有两种字符串类型:Unicode字符串和非Unicode字符串。Python3中只有一种类型:Unicode字符串。 5、xrange() python2里,有两种方法获得一定范围内的数字:range(),返回一个列表,还有xrange(),返回一个迭代器。 python3 里,range()返回迭代器,xrange()不再存在。 更多不同:https://www.cnblogs.com/weikunzz/p/6857971.html 17、用一行代码实现数值交换: a = 1 b = 2 答案:a = 1 b = 2 a,b = b,a 18、Python3和Python2中 int 和 long的区别? python2有非浮点数准备的int和long类型。int类型最大值不能超过sys.maxint,而且这个最大值是平台相关的。可以通过在数字的末尾附上一个L来定义长整型,显然,它比int类型表示的数字范围更大。在python3里,只有一种整数类型int,大多数情况下,和python2中的长整型类似。 19、xrange和range的区别? python2里,有两种方法获得一定范围内的数字:range(),返回一个列表,还有xrange(),返回一个迭代器。python3 里,range()返回迭代器,xrange()不再存在。 20、文件操作时:xreadlines和readlines的区别? readlines返回一个list,xreadlines方法返回一个生成器 21、列举布尔值为False的常见值? 0, [] , () , {} , '' , False , None 22、字符串、列表、元组、字典每个常用的5个方法? 字符串:repleace,strip,split,reverse,upper,lower,join.....列表:append,pop,insert,remove,sort,count,index.....元组:index,count,__len__(),__dir__()字典:get,keys,values,pop,popitems,clear,update,items..... 23、lambda表达式格式以及应用场景? 表达式格式:lambda后面跟一个或多个参数,紧跟一个冒号,以后是一个表达式。冒号前是参数,冒号后是返回值。例如:lambda x : 2x应用场景:经常与一些内置函数相结合使用,比如说map(),filter(),sorted(),reduce()等 24、pass的作用? 1、空语句 do nothing2、保证格式完整3、保证语义完整 25、arg和*kwarg作用? 万能参数,解决了函数参数不固定的问题*arg:会把位置参数转化为tuple**kwarg:会把关键字参数转化为dict 26、is和==的区别? is:判断内存地址是否相等==:判断数值是否相等 27、简述Python的深浅拷贝以及应用场景? copy():浅copy,浅拷贝指仅仅拷贝数据集合的第一层数据deepcopy():深copy,深拷贝指拷贝数据集合的所有层 28、Python垃圾回收机制? python采用的是引用计数机制为主,标记-清除和分代收集(隔代回收、分代回收)两种机制为辅的策略 计数机制 Python的GC模块主要运用了引用计数来跟踪和回收垃圾。在引用计数的基础上,还可以通过“标记-清除” 解决容器对象可能产生的循环引用的问题。通过分代回收以空间换取时间进一步提高垃圾回收的效率。 标记-清除: 标记-清除的出现打破了循环引用,也就是它只关注那些可能会产生循环引用的对象 缺点:该机制所带来的额外操作和需要回收的内存块成正比。 隔代回收 原理:将系统中的所有内存块根据其存活时间划分为不同的集合,每一个集合就成为一个“代”, 垃圾收集的频率随着“代”的存活时间的增大而减小。也就是说,活得越长的对象,就越不可能是垃圾, 就应该减少对它的垃圾收集频率。那么如何来衡量这个存活时间:通常是利用几次垃圾收集动作来衡量, 如果一个对象经过的垃圾收集次数越多,可以得出:该对象存活时间就越长。 29、python的可变类型和不可变类型? 不可变类型(数字、字符串、元组、不可变集合)可变类型(列表、字典、可变集合) 30、求结果: v = dict.fromkeys(['k1','k2'],[]) v['k1'].append(666) print(v) v['k1'] = 777 print(v) 答案:{'k1':[666],'k2':[666]} {'k1':777,'k2':[666]} 解析:formkeys()默认参数为可变数据类型时有坑 31、求结果: def num(): return [lambda x: i*x for i in range(4)] print([m(2) for m in num()]) 答案:[6, 6, 6, 6] 解析: 问题的本质在与python中的属性查找规则,LEGB(local,enclousing,global,bulitin), 在上面的例子中,i就是在闭包作用域(enclousing),而Python的闭包是 迟绑定 , 这意味着闭包中用到的变量的值,是在内部函数被调用时查询得到的 所以:[lambda x: i*x for i in range(4)]打印出来是含有四个内存地址的列表,每个内存地址中的i 在在本内存中都没有被定义,而是通过闭包作用域中的i值,当for循环执行结束后,i的值等于3,所以 再执行[m(2) for m in num()]时,每个内存地址中的i值等于3,当x等于2时,打印出来的结果都是6, 从而得到结果[6, 6, 6, 6]。 32、列举常见的内置函数? map,filter,zip,len,bin,oct,hex,int,float,bool,sum,min,max,str,list,tuple,dict,range,next,hash,help,id..... 33、filter、map、reduce的作用? filter(function,iterable)过滤函数map(function,iterable)循环函数reduce(function, iterable)累积函数 34、一行代码实现9*9乘法表。 lis = ['%s*%s=%s'%(i,j,i*j) for i in range(1,10) for j in range(i,10)] 35、如何安装第三方模块?以及用过哪些第三方模块? pip3 imstall 模块名django,Matplotlib,Tornado,PyGame 36、至少列举8个常用模块都有那些? os,sys,time,random,re,hashlib,logging,json,pickle.... 37、re的match和search区别? match:从字符串的开头位置匹配,必须以此为开头search:从开头开始查,找到符合的就返回结果 38、什么是正则的贪婪匹配? 正则表达式一般趋向于最大长度匹配 39、求结果: a. [ i % 2 for i in range(10) ] ===>[0,1,0,1,0,1,0,1,0,1]b. ( i % 2 for i in range(10) )===>返回一个生成器的内存地址 40、求结果: a. 1 or 2 =========>1b. 1 and 2 ========>2c. 1 < (2==2)======>falsed. 1 < 2 == 2======>ture 41、def func(a,b=[]) 这种写法有什么坑? def func(a,b=[]): b.append(a) print(b) 函数的第二个默认参数是一个list,当第一次执行的时候实例化了一个list, 第二次执行还是用第一次执行的时候实例化的地址存储,以后每次实例化都是 42、如何实现 "1,2,3" 变成 ['1','2','3'] ? a = "1,2,3"li = a.split(',') 43、如何实现[‘1’,’2’,’3’]变成[1,2,3] ? li = ['1','2','3']lis = list(map(lambda x:int(x) li)) 44、比较: a = [1,2,3] 和 b = [(1),(2),(3) ] 以及 b = [(1,),(2,),(3,) ] 的区别? a = [1,2,3]正常的列表b = [(1),(2),(3)] 虽然列表的每个元素加上了括号,但是当括号内只有一个元素并且没有逗号时,其数据类型是元素本身的数据类型b = [(1,),(2,),(3,)]列表中的元素类型都是元组类型 45、如何用一行代码生成[1,4,9,16,25,36,49,64,81,100] ? li = [x*x for x in range(1,11)] 46、一行代码实现删除列表中重复的值 ? li = [1, 1, 1, 23, 3, 4, 4]new_li = list(set(li))new_li.sort(key=li.index) 47、如何在函数中设置一个全局变量 ? 使用python的内置语法 globals 全局变量 48、logging模块的作用?以及应用场景? logging模块的作用:1、程序调试2、了解软件程序运行情况,是否正常3、软件程序运行故障分析与问题定位应用场景:网站的运维工作,程序实时监控 49、请用代码简答实现stack 。 def Stack(object): def __init__(self): self.stack = [] def push(self,value): # 进栈 self.stack.append(value) def pop(self): # 出栈 if self.stack: self.stack.pop() else: raise LookupError('stack is empty!') def is_empty(self): # 查看stack是否为空 reture bool(self.stack) def top(self): # 取出stack中最新的值 return self.stack[-1] 50、常用字符串格式化哪几种? 1、%s %d2、format格式化输出3、print(f'内容{变量名}') 51、简述 生成器、迭代器、可迭代对象 以及应用场景? 生成器:在 Python 中,一边循环一边计算的机制,称为 生成器(generator), 通过next()取值,两种表现形式1、将列表生成式的[]改为()2、含有yield关键字的函数 应用场景:优化代码,节省内存 迭代器:是访问集合元素的一种方式。迭代器同时实现了__iter__和__next__方法 可迭代对象:只要实现了__iter__方法的对象就是可迭代对象 52、用Python实现一个二分查找的函数。 lis = [0, 1, 3, 4, 5, 6, 7, 9, 10, 11,12,16,17] def two_find(x, lis, start=0, end=None): if end == None:end = len(lis) - 1 num = (end - start) // 2 + start if end > start: if lis[num] > x: return two_find(x, lis, start=start, end=num) elif lis[num] < x: return two_find(x, lis, start=num + 1, end=end) elif lis[num] == x: return num elif lis[end] == x:return end else:return None print(two_find(17, lis)) 53、谈谈你对闭包的理解? 在一个外函数中定义了一个内函数,内函数里运用了外函数的临时变量,并且外函数的返回值是内函数的引用。这样就构成了一个闭包。一般情况下,在我们认知当中,如果一个函数结束,函数的内部所有东西都会释放掉,还给内存,局部变量都会消失。但是闭包是一种特殊情况,如果外函数在结束的时候发现有自己的临时变量将来会在内部函数中用到,就把这个临时变量绑定给了内部函数,然后自己再结束。 54、os和sys模块的作用? os模块负责程序与操作系统的交互,提供了访问操作系统底层的接口;sys模块负责程序与python解释器的交互,提供了一系列的函数和变量,用于操控python的运行时环境。 55、如何生成一个随机数? import random def rdm(n): lis = [] for i in range(n): n = random.randint(1,9) lis.append(str(n)) s = ''.join(lis) return int(s) 56、如何使用python删除一个文件? import osos.remove(r'path') 57、谈谈你对面向对象的理解? 面向对象的程序设计的核心是对象(上帝式思维),要理解对象为何物,必须把自己当成上帝,上帝眼里世间存在的万物皆为对象,不存在的也可以创造出来。对象是特征和技能的结合,其中特征和技能分别对应对象的数据属性和方法属性。优点是:解决了程序的扩展性。对某一个对象单独修改,会立刻反映到整个体系中,如对游戏中一个人物参数的特征和技能修改都很容易。缺点:可控性差,无法向面向过程的程序设计流水线式的可以很精准的预测问题的处理流程与结果,面向对象的程序一旦开始就由对象之间的交互解决问题,即便是上帝也无法预测最终结果。应用场景:需求经常变化的软件,一般需求的变化都集中在用户层,互联网应用,企业内部软件,游戏等都是面向对象的程序设计大显身手的好地方。 58、Python面向对象中的继承有什么特点? 1:在继承中基类的构造(__init__()方法)不会被自动调用,它需要在其派生类的构造中亲自专门调用。 2:在调用基类的方法时,需要加上基类的类名前缀,且需要带上self参数变量。 区别于在类中调用普通函数时并不需要带上self参数 3:Python总是首先查找对应类型的方法,如果它不能在派生类中找到对应的方法,它才开始到基类中逐个查找。 (先在本类中查找调用的方法,找不到才去基类中找)。 59、面向对象深度优先和广度优先是什么? Python的类可以继承多个类,那么其寻找类方法的方式有两种: 当类是经典类时(主要在python2版本中的没有主动继承object的类),多继承情况下,会按照深度优先方式查找 当类是新式类时(python3版本中的所有类和python2中主动继承object的类),多继承情况下,会按照广度优先方式查找 简单点说就是:经典类是纵向查找,新式类是横向查找 60、面向对象中super的作用? 1、super在面向对象继承类中代指父类,书写方法super(类名,self).属性或者方法或super().属性或者方法 2、super方法可以增加类之间调用的灵活性,当父类名发生变化时不必修改 3、super方法在类的多继承时可以简化代码,避免代码冗余 4、super机制里可以保证公共父类仅被执行一次,执行的顺序遵循MRO,广度优先查询方法 61、是否使用过functools中的函数?其作用是什么? functools用于高阶函数:指那些作用于函数或者返回其他函数的函数。通常情况下,只要是 可以被当做函数调用的对象就是这个模块的目标。 62、列举面向对象中带双下划线的特殊方法,如:new、init __new__:构造方法,创建一个对象,实例化时第一个被执行,返回一个创建好的对象及__init__(self)的self, 只有继承了object的类才会有这个方法 __init__:初始化方法,__init__在__new__的基础上完成一些其它初始化的动作,__init__没有返回值 63、如何判断是函数还是方法? 函数和方法都封装了一些独立的功能,如果在类中定义的函数那就是方法(对象或者类名点方法名调用), 否则就是函数(函数名()直接调用) 64、静态方法和类方法区别? 静态方法:是既不是用类中的属性又不使用对象中的属性,由类或者对象调用的方法,依赖python装饰器@staticmethod来实现 类方法:只使用类中的静态变量,一般都是由类调用,依赖python装饰器@classmethod来实现 65、列举面向对象中的特殊成员以及应用场景? __call__:对象的构造方法,对象加上(),可以触发这个类的__call__方法。 __len__:内置函数的len函数是依赖类中的__len__方法 __eq__:判断值是否相等的时候依赖__eq__方法 __hash__:判断hash值是否相等的时候依赖__hash__方法(拓展:set的去重机制其实就是根据__hash__和__eq__方法实现的) __str__:和str() print() %s 都是息息相关的,返回值一定是字符串类型 __repr__:和 repr() %r都是息息相关的,在没有__str__方法时,__repr__可以完全取代__str__。 __del__ 析构方法,对应着一个对象的删除之前执行的内容 66、1、2、3、4、5 能组成多少个互不相同且无重复的三位数 count = 0 for i in range(1,6): for j in range(1,6): for k in range(1,6): if (i != j) and (i != k) and (j != k): count += 1 if count % 6: print(f'{i}{j}{k}', end='|') else: print(f'{i}{j}{k}') print(count) 67、什么是反射?以及应用场景? 定义:通过用字符串数据类型的变量名来访问这个变量的值,在python面向对象中的反射,通过字符串的形式操作对象相关的属性或方法. 应用场景:用于处理通过用户输入,文件读取,或者网络传输所得到的字符串形式的指令来完成对应的操作 68、metaclass作用?以及应用场景? metaclass,直译为元类,简单的解释就是:当我们定义了类以后,就可以根据这个类创建出实例, 所以:先定义类,然后创建实例。但是如果我们想创建出类呢?那就必须根据metaclass创建出类, 所以:先定义metaclass,然后创建类。换句话说,你可以把类看成是metaclass创建出来的“实例” 69、用尽量多的方法实现单例模式。 1、基于__new__()方法 class Person: def __new__(cls, *args, **kwargs): if not hasattr(cls,cls._instance): # cls._instance = object.__new__(cls) cls._instance = super().__new__(cls) return cls._instance 2、基于模块导入方式,现在一个py文件中写好一个类,实例化一个对象。以后用这个类直接导入这个模块就是单例模式。 3、基于装饰器方法实现 def singleton(cls, *args, **kwargs): instance_dic = {} def inner(*args, **kwargs): if cls not in instance_dic: instance_dic['cls'] = cls(*args, **kwargs) return instance_dic['cls'] return inner @singleton class Person: pass 70、装饰器的写法以及应用场景。 装饰器的写法: def wrapper(func): def inner(*args,**kwargs): '被装饰之前的操作' ret = func(*args,**kwargs) '被装饰之后的操作' return ret return inner 装饰器的应用场景: 比如注册登录、插入日志,性能测试,事务处理,缓存等等场景 71、异常处理写法以及如何主动跑出异常(应用场景) 异常处理的常规写法: try: 执行的主体函数 except Exception as e: print(str(e)) 主动抛出异常: raise TypeError('出现了不可思议的异常')#TypeError可以是任意的错误类型 72、什么是面向对象的mro MRO(Method Resolution Order 方法解析顺序)是面向对象中用于查询类的多继承的继承顺序的方法, 它是基于算法来实现的,不同的算法实现的MRO的顺序不同 73、isinstance作用以及应用场景? isinstance作用是来判断一个对象是否是一个已知的类型 74、写代码并实现: Given an array of integers, return indices of the two numbers such that they add up to a specific target. You may assume that each input would have exactly one solution, and you may not use the same element twice. Example: Given nums = [2, 7, 11, 15], target = 9, Because nums[0] + nums[1] = 2 + 7 = 9, return [0, 1] 代码实现 def func(li,target): try: for i in range(0,len(li)): num = target-li[i] if num in li: return [i,li.index(num)] except:print('li类型为数组类型,内的元素需是整型,target也为整型,请检查') else:return None 75、json序列化时,可以处理的数据类型有哪些?如何定制支持datetime类型? 1、可以处理的数据类型是 string、int、list、tuple、dict、bool、null 2、定制支持datetime类型 --------------------------官方文档的memo----------------------------------------------- >>> import json >>> class ComplexEncoder(json.JSONEncoder): ... def default(self, obj): ... if isinstance(obj, complex): ... return [obj.real, obj.imag] ... return json.JSONEncoder.default(self, obj) ... >>> dumps(2 + 1j, cls=ComplexEncoder) '[2.0, 1.0]' >>> ComplexEncoder().encode(2 + 1j) '[2.0, 1.0]' >>> list(ComplexEncoder().iterencode(2 + 1j)) ['[', '2.0', ', ', '1.0', ']'] ---------------------------------------------------------------------------------------- import json import datetime ret = datetime.datetime.now() class CJsonEncoder(json.JSONEncoder): def default(self, obj): if isinstance(obj, datetime.date): return obj.strftime('%Y-%m-%d %H:%M:%S') else: return json.JSONEncoder.default(self, obj) print(json.dumps(ret,cls=CJsonEncoder)) 76、json序列化时,默认遇到中文会转换成unicode,如果想要保留中文怎么办? 在序列化是将json.dumps中的默认参数ensure_ascii改为False就可以保留中文了 json.dumps(obj,ensure_ascii=False) 77、什么是断言?应用场景? assert 条件,'自定义错误提示(可有可无)' 例:assert 1 == 0,'这是一个低级的错误' 合约式设计是断言的经典应用,在一个正确的程序里,所有的前置条件和后置条件都将得到处理。 78、使用代码实现查看列举目录下的所有文件。 方法一:递归处理 import os url = r'C:\Users\Mr.Wang\PycharmProjects\untitled\前段学习' def check_file(url,li = []): if os.path.isdir(url): file_list = os.listdir(url) for ret in file_list: base_url = os.path.join(url,ret) if os.path.isfile(base_url): li.append(ret) else: check_file(base_url) return li else:return os.path.basename(url) 方法二:堆栈的思想处理 import os url = r'C:\Users\Mr.Wang\PycharmProjects\untitled\python基础' lis = [url] while lis: url = lis.pop() ret_list = os.listdir(url) for name in ret_list: abs_path = os.path.join(url,name) if os.path.isdir(abs_path): lis.append(abs_path) else:print(name) 79、简述 yield和yield from关键字。 yield 是一个类似 return 的关键字,只是这个函数返回的是个生成器当你调用这个函数的时候, 函数内部的代码并不立马执行 ,这个函数只是返回一个生成器对象,当你使用for进行迭代的时候, 函数中的代码才会执行 yield from 的主要功能是打开双向通道,把最外层的调用方与最内层的子生成器连接起来, 这样二者可以直接发送和产出值,还可以直接传入异常,而不用在位于中间的协程中添加大量处理异常的样板代码。 有了这个结构,协程可以通过以前不可能的方式委托职责。 更多解析详见:http://blog.gusibi.com/post/python-coroutine-yield-from/ 80、代码实现六位随机验证码 import random s = '' for i in range(6): num = random.randint(0,9) alpha1 = chr(random.randint(65,90)) alpha2 = chr(random.randint(97,122)) ret = random.choice([num,alpha1,alpha2]) s += str(ret) print(s) 81、代码实现随机发红包功能 import random def red_packge(money,num): li = random.sample(range(1,money*100),num-1) li.extend([0,money*100]) li.sort() return [(li[index+1]-li[index])/100 for index in range(num)] ret = red_packge(100,10) print(ret) --------------------------生成器版------------------------------------------- import random def red_packge(money,num): li = random.sample(range(1,money*100),num-1) li.extend([0,money*100]) li.sort() for index in range(num): yield (li[index+1]-li[index])/100 ret = red_packge(100,10) print(ret) ---------------------------九九八十一难后继续闯关东:------------------------------- 1、请尽可能列举python列表的成员方法,并给出列表操作的答案: (1) a=[1, 2, 3, 4, 5], a[::2]=? a[-2:]=? a[::2]=[1,3,5], a[-2:] = [4,5] (2)一行代码实现对列表a中的偶数位置的元素进行加3后求和? sum([i+3 for i in a[::2]]) (3)将列表a的元素顺序打乱,再对a进行排序得到列表b,然后把a和b按元素顺序构造一个字典d。 import random random.shuffle(a) b=a.sort() d={} for i in range(len(a)):d[a[i]] = b[i] 2、 Python自省 自省就是面向对象的语言所写的程序在运行时,就能知道对象的类型。也就是程序运行时能够获得对象的类型。比如type(),dir(),getattr(),hasattr(),isinstance()。 3、Python是如何进行内存管理的? 从三个方面来说,一对象的引用计数机制,二垃圾回收机制,三内存池机制 一、对象的引用计数机制 Python内部使用引用计数,来保持追踪内存中的对象,所有对象都有引用计数。 引用计数增加的情况: 1,一个对象分配一个新名称 2,将其放入一个容器中(如列表、元组或字典) 引用计数减少的情况: 1,使用del语句对对象别名显示的销毁 2,引用超出作用域或被重新赋值 sys.getrefcount( )函数可以获得对象的当前引用计数 多数情况下,引用计数比你猜测得要大得多。对于不可变数据(如数字和字符串),解释器会在程序的不同部分共享内存,以便节约内存。 二、垃圾回收 1,当一个对象的引用计数归零时,它将被垃圾收集机制处理掉。 2,当两个对象a和b相互引用时,del语句可以减少a和b的引用计数,并销毁用于引用底层对象的名称。然而由于每个对象都包含一个对其他对象的应用,因此引用计数不会归零,对象也不会销毁。(从而导致内存泄露)。为解决这一问题,解释器会定期执行一个循环检测器,搜索不可访问对象的循环并删除它们。 三、内存池机制 Python提供了对内存的垃圾收集机制,但是它将不用的内存放到内存池而不是返回给操作系统。 1,Pymalloc机制。为了加速Python的执行效率,Python引入了一个内存池机制,用于管理对小块内存的申请和释放。 2,Python中所有小于256个字节的对象都使用pymalloc实现的分配器,而大的对象则使用系统的malloc。 3,对于Python对象,如整数,浮点数和List,都有其独立的私有内存池,对象间不共享他们的内存池。也就是说如果你分配又释放了大量的整数,用于缓存这些整数的内存就不能再分配给浮点数。 4、介绍一下except的用法和作用? try…except…except…[else…][finally…] -- 执行try下的语句,如果引发异常,则执行过程会跳到except语句。对每个except分支顺序尝试执行,如果引发的异常与except中的异常组匹配,执行相应的语句。如果所有的except都不匹配,则异常会传递到下一个调用本代码的最高层try代码中。 -- try下的语句正常执行,则执行else块代码。如果发生异常,就不会执行 -- 如果存在finally语句,最后总是会执行。 5、如何用Python来进行查询和替换一个文本字符串? 可以使用re模块中的sub()函数或者subn()函数来进行查询和替换,比replace的功能更强大!!! 格式:sub(replacement, string[,count=0])(replacement是被替换成的文本,string是需要被替换的文本,count是一个可选参数,指最大被替换的数量) import re p=re.compile("blue|white|red") print(p.sub('colour','blue socks and red shoes')) print(p.sub('colour','blue socks and red shoes',count=1)) subn()方法执行的效果跟sub()一样,不过它会返回一个二维数组,包括替换后的新的字符串和总共替换的数量 6、有没有一个工具可以帮助查找python的bug和进行静态的代码分析? PyChecker是一个python代码的静态分析工具,它可以帮助查找python代码的bug, 会对代码的复杂度和格式提出警告 Pylint是另外一个工具可以进行codingstandard检查

优秀的个人博客,低调大师

Python机器学习算法面试题,唯一的缺点就是资料太充足,史上最全!

朴素贝叶斯P(A∩B)=P(A)P(B|A)=P(B)P(A|B) 所以有:P(A|B)=P(B|A)*P(A)/P(B) 对于给出的待分类项,求解在此项出现的条件下各个目标类别出现的概率,哪个最大,就认为此待分类项属于哪个类别 工作原理 假设现在有样本x=(a1,a2,a3,…an)这个待分类项(并认为x里面的特征独立)再假设现在有分类目标Y={y1,y2,y3,y4..yn}那么max(P(y1|x),P(y2|x),P(y3|x)..P(yn|x))中的最大者就是最终的分类类别而P(yi|x)=p(x|yi)*P(yi)/P(x)因为x对于每个分类目标来说都一样,所以就是求max(P(x|yi)*p(yi))P(x|yi)p(yi)=p(yi)PI(P(ai|yi)) (PI表示连乘)而具体的p(ai|yi)和p(yi)都是能从训练样本中统计出来p(ai|yi)表示该类别下该特征出现的概率p(yi)表示全部类别中这个这个类别出现的概率好的,就是这么工作的^_^工作流程 准备阶段确定特征属性,并对每个特征属性进行适当划分,然后由人工对一部分待分类项进行分类,形成训练样本。训练阶段计算每个类别在训练样本中的出现频率及每个特征属性划分对每个类别的条件概率估计应用阶段使用分类器进行分类,输入是分类器和待分类样本,输出是样本属于的分类类别属性特征 特征为离散值时直接统计即可(表示统计概率)特征为连续值的时候假定特征符合高斯分布:g(x,n,u)那么p(ak|yi)=g(xk,ni,ui)Laplace校准(拉普拉斯校验) 当某个类别下某个特征划分没有出现时,会有P(a|y)=0,就是导致分类器质量降低,所以此时引入Laplace校验,就是对没类别下所有划分的计数加1。 遇到特征之间不独立问题 参考改进的贝叶斯网络,使用DAG来进行概率图的描述 优缺点 朴素贝叶斯的优点: 对小规模的数据表现很好,适合多分类任务,适合增量式训练。缺点:对输入数据的表达形式很敏感(离散、连续,值极大极小之类的)。逻辑回归和线性回归 LR回归是一个线性的二分类模型,主要是计算在某个样本特征下事件发生的概率,比如根据用户的浏览购买情况作为特征来计算它是否会购买这个商品,抑或是它是否会点击这个商品。然后LR的最终值是根据一个线性和函数再通过一个sigmod函数来求得,这个线性和函数权重与特征值的累加以及加上偏置求出来的,所以在训练LR时也就是在训练线性和函数的各个权重值w。 关于这个权重值w一般使用最大似然法来估计,比如yi=1的概率是pi,则yi=0的概率是1-pi,那么观测概率为p(yi)=pi^yi(1-pi)^(1-yi)这个这个最大似然函数为(hw(xi)^yi(1-hw(xi))^(1-yi))连乘,对这个似然函数取对数之后就会得到的表达式L(w)=sigma(yilog(hw(xi))-(1-yi)log(1-hw(xi)))=sigma(yi(wxi)-log(1+exp(wxi))),估计这个L(w)的极大值就可以得到w的估计值。 所以求解问题就变成了这个最大似然函数的最优化问题,这里通常会采样随机梯度下降法和拟牛顿迭代法来进行优化 梯度下降法 如果hw(x)=1/(1-e^(-wx)), 则cost function=-1/m sigma(yilog(hw(xi)+(1-yi)*log(1-hw(xi)))=j(w) 这里就成了就min(j(w)) 所以更新w的过程为 w:=w-lamea*j(w)’ (求导) w:=w-lamea 1/msigmam-yi)*xi) 直到j(w)不能再的时候停止 梯度下降法的最大问题就是会陷入局部最优,并且每次在对当前样本计算cost的时候都需要去遍历全部样本才能得到cost值,这样计算速度就会慢很多(虽然在计算的时候可以转为矩阵乘法去更新整个w值) 所以现在好多框架(mahout)中一般使用随机梯度下降法,它在计算cost的时候只计算当前的代价,最终cost是在全部样本迭代一遍之求和得出,还有他在更新当前的参数w的时候并不是依次遍历样本,而是从所有的样本中随机选择一条进行计算,它方法收敛速度快(一般是使用最大迭代次数),并且还可以避免局部最优,并且还很容易并行(使用参数服务器的方式进行并行) 这里SGD可以改进的地方就是使用动态的梯度值alpha=0.04*(1.0+n+i)+Rate 其他优化方法 拟牛顿法(记得是需要使用Hessian矩阵和cholesky分解)BFGSL-BFGS优缺点:无需选择学习率α,更快,但是更复杂关于LR的过拟合问题: 如果我们有很多的特性,在训练集上拟合得很好,但是在预测集上却达不到这种效果 减少feature个数(人工定义留多少个feature、算法选取这些feature) 正则化(留下所有的feature,但对于部分feature定义其parameter非常小),在cost上加 lamea(sigma(w^2)),同时w的更新变为w:=w-rate 1/msigmam-yi)xi+ (lamea/m)w。注意:这里的w0不受正则化影响关于LR的多分类:softmax softmax:假设离散型随机变量Y的取值集合是{1,2,..,k},则多分类的LR为 P(Y=a|x)=exp(wax)/(1-1到k求和(wkx)) 1 这里会输出当前样本下属于哪一类的概率,并且满足全部概率加起来=1 关于softmax和k个LR的选择 如果类别之间是否互斥(比如音乐只能属于古典音乐、乡村音乐、摇滚月的一种)就用softmax 否则类别之前有联系(比如一首歌曲可能有影视原声,也可能包含人声,或者是舞曲),这个时候使用k个LR更为合适 优缺点: Logistic回归优点: 实现简单;分类时计算量非常小,速度很快,存储资源低;缺点: 容易欠拟合,一般准确度不太高只能处理两分类问题(在此基础上衍生出来的softmax可以用于多分类),且必须线性可分;KNN算法 给一个训练数据集和一个新的实例,在训练数据集中找出与这个新实例最近的k个训练实例,然后统计最近的k个训练实例中所属类别计数最多的那个类,就是新实例的类 三要素: k值的选择距离的度量(常见的距离度量有欧式距离,马氏距离等)分类决策规则 (多数表决规则)k值的选择 k值越小表明模型越复杂,更加容易过拟合但是k值越大,模型越简单,如果k=N的时候就表明无论什么点都是训练集中类别最多的那个类所以一般k会取一个较小的值,然后用过交叉验证来确定这里所谓的交叉验证就是将样本划分一部分出来为预测样本,比如95%训练,5%预测,然后k分别取1,2,3,4,5之类的,进行预测,计算最后的分类误差,选择误差最小的kKNN的回归 在找到最近的k个实例之后,可以计算这k个实例的平均值作为预测值。或者还可以给这k个实例添加一个权重再求平均值,这个权重与度量距离成反比(越近权重越大)。 优缺点: KNN算法的优点: 思想简单,理论成熟,既可以用来做分类也可以用来做回归;可用于非线性分类;训练时间复杂度为O(n);准确度高,对数据没有假设,对outlier不敏感;缺点: 计算量大;样本不平衡问题(即有些类别的样本数量很多,而其它样本的数量很少);需要大量的内存;KD树 KD树是一个二叉树,表示对K维空间的一个划分,可以进行快速检索(那KNN计算的时候不需要对全样本进行距离的计算了) 构造KD树 在k维的空间上循环找子区域的中位数进行划分的过程。 假设现在有K维空间的数据集T={x1,x2,x3,…xn},xi={a1,a2,a3..ak} 首先构造根节点,以坐标a1的中位数b为切分点,将根结点对应的矩形局域划分为两个区域,区域1中a1b构造叶子节点,分别以上面两个区域中a2的中位数作为切分点,再次将他们两两划分,作为深度1的叶子节点,(如果a2=中位数,则a2的实例落在切分面)不断重复2的操作,深度为j的叶子节点划分的时候,索取的ai 的i=j%k+1,直到两个子区域没有实例时停止KD树的搜索 首先从根节点开始递归往下找到包含x的叶子节点,每一层都是找对应的xi将这个叶子节点认为是当前的“近似最近点”递归向上回退,如果以x圆心,以“近似最近点”为半径的球与根节点的另一半子区域边界相交,则说明另一半子区域中存在与x更近的点,则进入另一个子区域中查找该点并且更新”近似最近点“重复3的步骤,直到另一子区域与球体不相交或者退回根节点最后更新的”近似最近点“与x真正的最近点KD树进行KNN查找 通过KD树的搜索找到与搜索目标最近的点,这样KNN的搜索就可以被限制在空间的局部区域上了,可以大大增加效率。 KD树搜索的复杂度 当实例随机分布的时候,搜索的复杂度为log(N),N为实例的个数,KD树更加适用于实例数量远大于空间维度的KNN搜索,如果实例的空间维度与实例个数差不多时,它的效率基于等于线性扫描。 SVM、SMO 对于样本点(xi,yi)以及svm的超平面:wix+b=0 函数间隔:yi(wxi+b)几何间隔:yi(wxi+b)/||w||,其中||w||为w的L2范数,几何间隔不会因为参数比例的改变而改变svm的基本想法就是求解能正确划分训练样本并且其几何间隔最大化的超平面。线性SVM问题 yi(wxi+b)/||w||>=d (使用几何间隔) 求max(d) 那么假设d’=d||w|| 则将问题转为:yi(wxi+b)>=1,max(d’/||w||) 由于d’的成比例增减不会影响实际间距,所以这里的取d’=1,又因为max(1/||w||)=min(1/2||w||^2) 所以最终的问题就变为了 yi(wxi+b)>=1,min(1/2*||w||^2) 这样就变成了一个凸的二次规划化,可以将其转换为拉格朗日函数,然后使用对偶算法来求解 对偶求解 L(w,b,a)=1/2||w||^2-sigma(aiyi(wxi+b))+sigma(ai) 其中a={a1,a2..an}为拉格朗日向量 根据对偶性质 原始问题就是求对偶问题的极大极小max[a]min[w,b]L(w,b,a) 先求L对w,b的极小,再求对a的极大 求min[w,b]L(w,b,a): L’(w)=w-sigma(aiyixi)=0 L’(b)=sigma(aiyi)=0; 代入后可得min[w,b]L(w,b,a)=-1/2*sigma(sigma(aiajyiyj(xi·xj)))+sigma(ai) 求min[w,b]L(w,b,a)对a的极大 max[a] -1/2*sigma(sigma(aiajyiyj(xi·xj)))+sigma(ai) sigma(aiyi)=0 转成等价的对偶形式就是 min[a] 1/2*sigma(sigma(aiajyiyj(xi·xj)))-sigma(ai) sigma(aiyi)=0 假如求解出来的a为a^=(a1,a2,…an) 则得到最优的w,b分别为 w^=sigma(aiyixi) b^=yj-sigma(aiyi(xi·xj)) 所以,最终的决策分类面为 f=sign(sigma(aiyi(x·xi))+b^ 也就是说,分类决策函数只依赖于输入x与训练样本的输入的内积 与分离超平面最近的样本点称为支持向量损失函数 经验损失函数:sigma(1-yi(wxi+b)) (注意,如果该值小于0时直接取0即可) 合页损失函数:sigma(1-yi(wi+b)) + leama||w||^2 后面的是L2正则项 为什么要引入对偶算法 对偶问题往往更加容易求解(结合拉格朗日和kkt条件)可以很自然的引用核函数(拉格朗日表达式里面有内积,而核函数也是通过内积进行映射的)核函数 将输入特征x(线性不可分)映射到高维特征R空间,可以在R空间上让SVM进行线性可以变,这就是核函数的作用 多项式核函数:K(x,z)=(x*z+1)^p高斯核函数:K(x,z)=exp(-(x-z)^2/a^2) a为均值字符串核函数:好像用于文本匹配、检索之类的,不懂SVM优缺点 优点: 使用核函数可以向高维空间进行映射使用核函数可以解决非线性的分类分类思想很简单,就是将样本与决策面的间隔最大化分类效果较好缺点: 对大规模数据训练比较困难,因为它是用二次规划来求解的无法直接支持多分类,但是可以使用间接的方法来做SMO SMO是用于快速求解SVM的 它选择凸二次规划的两个变量,其他的变量保持不变,然后根据这两个变量构建一个二次规划问题,这个二次规划关于这两个变量解会更加的接近原始二次规划的解,通过这样的子问题划分可以大大增加整个算法的计算速度,关于这两个变量: 其中一个是严重违反KKT条件的一个变量另一个变量是根据自由约束确定,好像是求剩余变量的最大化来确定的。SVM多分类问题 直接法直接在目标函数上进行修改,将多个分类面的参数求解合并到一个最优化问题中,通过求解该优化就可以实现多分类(计算复杂度很高,实现起来较为困难)间接法一对多其中某个类为一类,其余n-1个类为另一个类,比如A,B,C,D四个类,第一次A为一个类,{B,C,D}为一个类训练一个分类器,第二次B为一个类,{A,C,D}为另一个类,按这方式共需要训练4个分类器,最后在测试的时候将测试样本经过这4个分类器f1(x),f2(x),f3(x)和f4(x),取其最大值为分类器(这种方式由于是1对M分类,会存在偏置,很不实用)一对一(libsvm实现的方式)任意两个类都训练一个分类器,那么n个类就需要n*(n-1)/2个svm分类器。还是以A,B,C,D为例,那么需要{A,B},{A,C},{A,D},{B,C},{B,D},{C,D}为目标共6个分类器,然后在预测的将测试样本通过这6个分类器之后进行投票选择最终结果。(这种方法虽好,但是需要n*(n-1)/2个分类器代价太大,不过有好像使用循环图来进行改进)决策树 决策树是一颗依托决策而建立起来的树。 ID3 首先是针对当前的集合,计算每个特征的信息增益然后选择信息增益最大的特征作为当前节点的决策决策特征根据特征不同的类别划分到不同的子节点(比如年龄特征有青年,中年,老年,则划分到3颗子树)然后继续对子节点进行递归,直到所有特征都被划分S(C,ai)=-sigma(pilog(pi)) 一个属性中某个类别的熵 pi=P(yi|ai) pi表示ai情况下发生yi的概率,也即是统计概率 S(C,A)=sigma(P(A=ai)S(ai)) 整个属性的熵,为各个类别的比例与各自熵的加权求和 Gain(C,A)=S(C)-S(C,A) 增益表示分类目标的熵减去当前属性的熵,增益越大,分类能力越强 (这里前者叫做经验熵,表示数据集分类C的不确定性,后者就是经验条件熵,表示在给定A的条件下对数据集分类C的不确定性,两者相减叫做互信息,决策树的增益等价于互信息) 比如说当前属性是是否拥有房产,分类是是否能偿还债务 现在: 有用房产为7个,4个能偿还债务,3个无法偿还债务然后无房产为3个,其中1个能偿还债务,2个无法偿还债务然后S(有房产)=-(4/7log4/7+3/7log3/7) S(无房产)=-(1/3log1/3+2/3log2/3) 其中S(分类)=-(5/10log5/10+5/10log5/10) 最终的增益=S(分类)-(7/10S(有房产)+3/10S(无房产)) 最大越好 关于损失函数 设树的叶子节点个数为T,t为其中一个叶子节点,该叶子节点有Nt个样本,其中k类的样本有Ntk个,H(t)为叶子节点上的经验熵,则损失函数定义为 Ct(T)=sigma(Nt*H(t))+ lamdba |T| 其中H(t)=sigma(Ntk/Nt*log(Ntk/Nt)) 代入可以得到Ct(T)=sigma(sigma(Ntk*log(Ntk/Nt)))+lamdba|T| 最终有Ct(T)=C(T)+ lamdba|T| lamdba|T|为正则化项,leama是用于调节比率 决策树的生成只考虑了信息增益 C4.5 它是ID3的一个改进算法,使用信息增益率来进行属性的选择 splitInformation(S,A)=-sigma(|Si|/|S|*log2(|Si|/|S|)) GainRatio(S,A)=Gain(S,A)/splitInformation(S,A) 优缺点: 准确率高,但是子构造树的过程中需要进行多次的扫描和排序,所以它的运算效率较低 Cart 分类回归树(Classification And Regression Tree)是一个决策二叉树,在通过递归的方式建立,每个节点在分裂的时候都是希望通过最好的方式将剩余的样本划分成两类,这里的分类指标: 分类树:基尼指数最小化(gini_index)回归树:平方误差最小化分类树: 首先是根据当前特征计算他们的基尼增益选择基尼增益最小的特征作为划分特征从该特征中查找基尼指数最小的分类类别作为最优划分点将当前样本划分成两类,一类是划分特征的类别等于最优划分点,另一类就是不等于针对这两类递归进行上述的划分工作,直达所有叶子指向同一样本目标或者叶子个数小于一定的阈值gini用来度量分布不均匀性(或者说不纯),总体的类别越杂乱,GINI指数就越大(跟熵的概念很相似) gini(ai)=1-sigma(pi^2) pi当前数据集中第i类样本的比例 gini越小,表示样本分布越均匀(0的时候就表示只有一类了),越大越不均匀 基尼增益gini_gain=sigma(Ni/N*gini(ai)) 表示当前属性的一个混乱 Ni/N表示当前类别占所有类别的概率 最终Cart选择GiniGain最小的特征作为划分特征 以ID3中的贷款的那棵树为样例: gini(有房产)=1-((3/7)^2+(4/7)^2) //基尼指数 gini(无房产)=1-((1/3)^2+(2/3)^2) gini_gain=7/10gini(有房产)+3/10gini(无房产) //基尼增益 回归树: 回归树是以平方误差最小化的准则划分为两块区域遍历特征计算最优的划分点s,使其最小化的平方误差是:min{min(R1.sigma((yi-c1)^2))+min(R2.sigma((yi-c2)^2))}计算根据s划分到左侧和右侧子树的目标值与预测值之差的平方和最小,这里的预测值是两个子树上输入xi样本对应yi的均值找到最小的划分特征j以及其最优的划分点s,根据特征j以及划分点s将现有的样本划分为两个区域,一个是在特征j上小于等于s,另一个在在特征j上大于sR1(j)={x|x(j)<=s}、R2(j)={x|x(j)>s}进入两个子区域按上述方法继续划分,直到到达停止条件这里面的最小化我记得可以使用最小二乘法来求关于剪枝:用独立的验证数据集对训练集生长的树进行剪枝(事后剪枝)。 停止条件 直到每个叶子节点都只有一种类型的记录时停止,(这种方式很容易过拟合)另一种时当叶子节点的记录树小于一定的阈值或者节点的信息增益小于一定的阈值时停止关于特征与目标值 特征离散 目标值离散:可以使用ID3,cart特征连续 目标值离散:将连续的特征离散化 可以使用ID3,cart特征离散 目标值连续决策树的分类与回归 分类树输出叶子节点中所属类别最多的那一类回归树输出叶子节点中各个样本值的平均值理想的决策树 叶子节点数尽量少叶子节点的深度尽量小(太深可能会过拟合)解决决策树的过拟合 剪枝前置剪枝:在分裂节点的时候设计比较苛刻的条件,如不满足则直接停止分裂(这样干决策树无法到最优,也无法得到比较好的效果)后置剪枝:在树建立完之后,用单个节点代替子树,节点的分类采用子树中主要的分类(这种方法比较浪费前面的建立过程)交叉验证随机森林优缺点 优点: 计算量简单,可解释性强,比较适合处理有缺失属性值的样本,能够处理不相关的特征;缺点:单颗决策树分类能力弱,并且对连续值变量难以处理;容易过拟合(后续出现了随机森林,减小了过拟合现象);随机森林RF 随机森林是有很多随机得决策树构成,它们之间没有关联。得到RF以后,在预测时分别对每一个决策树进行判断,最后使用Bagging的思想进行结果的输出(也就是投票的思想) 学习过程 现在有N个训练样本,每个样本的特征为M个,需要建K颗树从N个训练样本中有放回的取N个样本作为一组训练集(其余未取到的样本作为预测分类,评估其误差)从M个特征中取m个特征左右子集特征(m<对采样的数据使用完全分裂的方式来建立决策树,这样的决策树每个节点要么无法分裂,要么所有的样本都指向同一个分类重复2的过程K次,即可建立森林预测过程 将预测样本输入到K颗树分别进行预测如果是分类问题,直接使用投票的方式选择分类频次最高的类别如果是回归问题,使用分类之后的均值作为结果参数问题 这里的一般取m=sqrt(M)关于树的个数K,一般都需要成百上千,但是也有具体的样本有关(比如特征数量)树的最大深度,(太深可能可能导致过拟合??)节点上的最小样本数、最小信息增益泛化误差估计 使用oob(out-of-bag)进行泛化误差的估计,将各个树的未采样样本作为预测样本(大约有36.8%),使用已经建立好的森林对各个预测样本进行预测,预测完之后最后统计误分得个数占总预测样本的比率作为RF的oob误分率。 学习算法 ID3算法:处理离散值的量C45算法:处理连续值的量Cart算法:离散和连续 两者都合适?关于CART Cart可以通过特征的选择迭代建立一颗分类树,使得每次的分类平面能最好的将剩余数据分为两类 gini=1-sigma(pi^2),表示每个类别出现的概率和与1的差值, 分类问题:argmax(Gini-GiniLeft-GiniRight) 回归问题argmax(Var-VarLeft-VarRight) 查找最佳特征f已经最佳属性阈值th 小于th的在左边,大于th的在右边子树 优缺点 能够处理大量特征的分类,并且还不用做特征选择在训练完成之后能给出哪些feature的比较重要训练速度很快很容易并行实现相对来说较为简单GBDT GBDT的精髓在于训练的时候都是以上一颗树的残差为目标,这个残差就是上一个树的预测值与真实值的差值。比如,当前样本年龄是18岁,那么第一颗会去按18岁来训练,但是训练完之后预测的年龄为12岁,差值为6,所以第二颗树的会以6岁来进行训练,假如训练完之后预测出来 Boosting的好处就是每一步的参加就是变相了增加了分错instance的权重,而对已经对的instance趋向于0,这样后面的树就可以更加关注错分的instance的训练了 Shrinkage Shrinkage认为,每次走一小步逐步逼近的结果要比每次迈一大步逼近结果更加容易避免过拟合。 y(1 ~ i) = y(1 ~ i-1) + step * yi 就像我们做互联网,总是先解决60%用户的需求凑合着,再解决35%用户的需求,最后才关注那5%人的需求,这样就能逐渐把产品做好.调参 树的个数 100~10000叶子的深度 3~8学习速率 0.01~1叶子上最大节点树 20训练采样比例 0.5~1训练特征采样比例 sqrt(num)优缺点: 优点: 精度高能处理非线性数据能处理多特征类型适合低维稠密数据缺点:并行麻烦(因为上下两颗树有联系)多分类的时候 复杂度很大BP 最小二乘法 最小二乘法是一种数学的优化技术,通过求最小化平方误差来寻找最佳的函数匹配 假设现在有二维的观测数据(x1,y1),(x2,y2)…(xn,yn),求y=a+bx的拟合。 现设yi=a+bxi+ki 如果有a,b能得到sigma(|ki|)最小,则该线比较理想 所以先变为求min(sigma(ki)) ,这个与min(sigma(ki^2))等价 而ki=yi-(a+bxi) 那么现设f=sigma((yi-(a+bxi))^2)求其最小即可 上述就是最小二乘原则,估计a,b的方法称为最小二乘法先求f对a,b的偏导: f’(a)=-2*sigma(yi-(a+bxi))=0 f’(b)=-2xisigma(yi-(a+bxi))=0 现设:X=sigma(xi)/n Y=sigma(yi)/ 则代入上述偏导: an+bnX=nY anX+bsigma(xi^2)=sigma(xiyi) 求该行列式: |n ,nX | |nX,sigma(xi^2)| =n*sigma((xi-X))!=0 所以有唯一解 最后记: l(xx)=sigma((xi-X)^2) l(yy)=sigma((yi-Y)^2) l(xy)=sigma((xi-X)(yi-Y)) 则b=l(xy)/l(xx) a=Y-bX 百度文库-最小二乘法 EM EM用于隐含变量的概率模型的极大似然估计,它一般分为两步:第一步求期望(E),第二步求极大(M), 如果概率模型的变量都是观测变量,那么给定数据之后就可以直接使用极大似然法或者贝叶斯估计模型参数。 但是当模型含有隐含变量的时候就不能简单的用这些方法来估计,EM就是一种含有隐含变量的概率模型参数的极大似然估计法。 应用到的地方:混合高斯模型、混合朴素贝叶斯模型、因子分析模型 Bagging 从N样本中有放回的采样N个样本对这N个样本在全属性上建立分类器(CART,SVM)重复上面的步骤,建立m个分类器预测的时候使用投票的方法得到结果Boosting boosting在训练的时候会给样本加一个权重,然后使loss function尽量去考虑那些分错类的样本(比如给分错类的样本的权重值加大) 凸优化 在机器学习中往往是最终要求解某个函数的最优值,但是一般情况下,任意一个函数的最优值求解比较困难,但是对于凸函数来说就可以有效的求解出全局最优值。 凸集 一个集合C是,当前仅当任意x,y属于C且0<=theta<=1,都有thetax+(1-theta)y属于C 用通俗的话来说C集合线段上的任意两点也在C集合中 凸函数 一个函数f其定义域(D(f))是凸集,并且对任意x,y属于D(f)和0<=theta<=1都有 f(thetax+(1-theta)y)<=thetaf(x)+(1-theta)f(y) —这个貌似叫做jensen不等式 用通俗的话来说就是曲线上任意两点的割线都在曲线的上方 常见的凸函数有: 指数函数f(x)=a^x a>1负对数函数-logax a>1,x>0开口向上的二次函数等凸函数的判定: 如果f是一阶可导,对于任意数据域内的x,y满足f(y)>=f(x)+f’(x)(y-x)如果f是二阶可导,凸优化应用举例 SVM:其中由max|w| 转向min(1/2*|w|^2)最小二乘法?LR的损失函数sigma(yilog(hw(x))+(1-yi)(log(1-hw(x))))

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Nacos

Nacos

Nacos /nɑ:kəʊs/ 是 Dynamic Naming and Configuration Service 的首字母简称,一个易于构建 AI Agent 应用的动态服务发现、配置管理和AI智能体管理平台。Nacos 致力于帮助您发现、配置和管理微服务及AI智能体应用。Nacos 提供了一组简单易用的特性集,帮助您快速实现动态服务发现、服务配置、服务元数据、流量管理。Nacos 帮助您更敏捷和容易地构建、交付和管理微服务平台。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册