Java算法模板 数据流快读

本文涉及的产品
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
云解析 DNS,旗舰版 1个月
简介: Java算法模板 数据流快读

灵感介绍

在Java中,"快读"通常指的是一种高效地从输入流中读取基本数据类型(如整数、浮点数、长整数等)的技术。这种技术主要用于竞赛编程或者需要高性能输入输出的场景,比如处理大量数据时。传统的Scanner类在大数据量的情况下性能可能较低,因此使用快速读取技术可以提高程序的运行效率。

在竞赛编程中,常用的快速读取技术包括使用BufferedReader和StringTokenizer或者DataInputStream,这些技术能够以更快的速度从输入中读取数据。

需要注意的是,虽然快速读取技术能够提高性能,但在实际使用中也需要注意其局限性,比如可能不支持某些特定的字符或者输入格式。

原理

快速读取数据的原理主要涉及以下几个方面:

  1. 缓冲区的利用
  • 快速读取技术通过使用缓冲区来一次性读取多个字节或字符,而不是每次只读取一个字节或字符。这样可以减少系统调用的次数,从而提高读取数据的效率。
  1. 减少IO操作
  • 传统的输入方法(如使用Scanner类)可能会频繁地进行IO操作,每次读取一个数据可能都会导致系统调用,这在大数据量时会影响性能。快速读取技术通过批量读取数据减少了系统调用次数,从而提升了整体的性能。
  1. 数据类型的解析
  • 快速读取技术需要能够有效地解析不同类型的数据(如整数、浮点数等)。为了高效地解析,通常会使用一些技巧,比如预先读取数据到缓冲区并逐个字符解析,或者通过位运算直接从字节流中读取数据。
  1. 性能优化
  • 在竞赛编程中,性能是关键因素之一。使用快速读取技术可以显著减少程序的运行时间,特别是在处理大量数据或者需要频繁输入输出的情况下。通过优化IO操作,可以避免因IO阻塞而导致的程序延迟。
  1. 选择合适的输入流
  • 在Java中,常见的快速读取技术包括使用DataInputStream或者BufferedReader。DataInputStream允许按原始数据类型(如int、long、double等)从输入流中读取数据,而BufferedReader则通过缓冲字符流来提高读取效率。

总的来说,快速读取技术的原理就是通过优化IO操作、利用缓冲区、有效解析数据类型等手段,从而实现高效、快速地从输入流中读取数据,适用于需要大量数据处理或者高性能要求的应用场景。

展示

代码实现

package Dduo;
import java.io.DataInputStream;
import java.io.IOException;
import java.util.*;
 
//BHU BigData1421 
//Eclipse IDE 2020.8
//JDK1.8
//2024/6/14
public class Main {
 
    static FastReader sc = new FastReader();
 
    public static void main(String[] args) {
        int n = 1;
//      long n=sc.nextLong();
        while (n-- > 0)
            solve();
    }
 
    public static void solve() {
 
    }
 
}
 
/*Java数据流快读*/
class FastReader {
    final private int BUFFER_SIZE = 1 << 16;
    private DataInputStream dis;
    private byte[] buffer;
    private int bufferPointer, bytesRead;
 
    public FastReader() {
        dis = new DataInputStream(System.in);
        buffer = new byte[BUFFER_SIZE];
        bufferPointer = bytesRead = 0;
    }
 
    public int nextInt() throws IOException {
        int num = 0;
        byte ch = read();
        while (ch <= ' ') {
            ch = read();
        }
        do {
            num = num * 10 + (ch - '0');
            ch = read();
        } while (ch >= '0' && ch <= '9');
        return num;
    }
 
    public double nextDouble() throws IOException {
        double num = 0;
        byte ch = read();
        while (ch <= ' ') {
            ch = read();
        }
        int sign = 1;
        if (ch == '-') {
            sign = -1;
            ch = read();
        }
        do {
            num = num * 10 + (ch - '0');
            ch = read();
        } while (ch >= '0' && ch <= '9');
 
        if (ch == '.') {
            double fraction = 1;
            ch = read();
            while (ch >= '0' && ch <= '9') {
                fraction /= 10;
                num += (ch - '0') * fraction;
                ch = read();
            }
        }
        return num * sign;
    }
 
    public long nextLong() throws IOException {
        long num = 0;
        byte ch = read();
        while (ch <= ' ') {
            ch = read();
        }
        int sign = 1;
        if (ch == '-') {
            sign = -1;
            ch = read();
        }
        do {
            num = num * 10 + (ch - '0');
            ch = read();
        } while (ch >= '0' && ch <= '9');
        return num * sign;
    }
 
    public String nextString() throws IOException {
        StringBuilder sb = new StringBuilder();
        byte ch = read();
        while (ch <= ' ') {
            ch = read();
        }
        do {
            sb.append((char) ch);
            ch = read();
        } while (ch > ' ');
        return sb.toString();
    }
 
    private byte read() throws IOException {
        if (bufferPointer == bytesRead) {
            fillBuffer();
        }
        return buffer[bufferPointer++];
    }
 
    private void fillBuffer() throws IOException {
        bytesRead = dis.read(buffer, 0, BUFFER_SIZE);
        bufferPointer = 0;
    }
    
}
 
 
 
目录
相关文章
|
2月前
|
存储 人工智能 算法
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
这篇文章详细介绍了Dijkstra和Floyd算法,这两种算法分别用于解决单源和多源最短路径问题,并且提供了Java语言的实现代码。
92 3
数据结构与算法细节篇之最短路径问题:Dijkstra和Floyd算法详细描述,java语言实现。
|
2月前
|
搜索推荐 Java 数据库连接
Java|在 IDEA 里自动生成 MyBatis 模板代码
基于 MyBatis 开发的项目,新增数据库表以后,总是需要编写对应的 Entity、Mapper 和 Service 等等 Class 的代码,这些都是重复的工作,我们可以想一些办法来自动生成这些代码。
39 6
|
2月前
|
算法 Java Linux
java制作海报四:java BufferedImage 转 InputStream 上传至OSS。png 图片合成到模板(另一个图片)上时,透明部分变成了黑色
这篇文章主要介绍了如何将Java中的BufferedImage对象转换为InputStream以上传至OSS,并解决了png图片合成时透明部分变黑的问题。
107 1
|
2月前
|
算法 搜索推荐 Java
java 后端 使用 Graphics2D 制作海报,画echarts图,带工具类,各种细节:如头像切割成圆形,文字换行算法(完美实验success),解决画上文字、图片后不清晰问题
这篇文章介绍了如何使用Java后端技术,结合Graphics2D和Echarts等工具,生成包含个性化信息和图表的海报,并提供了详细的代码实现和GitHub项目链接。
147 0
java 后端 使用 Graphics2D 制作海报,画echarts图,带工具类,各种细节:如头像切割成圆形,文字换行算法(完美实验success),解决画上文字、图片后不清晰问题
|
2月前
|
Java
Java PDF模板生成PDF
Java PDF模板生成PDF
51 1
|
2月前
|
算法 Java Linux
java制作海报一:java使用Graphics2D 在图片上写字,文字换行算法详解
这篇文章介绍了如何在Java中使用Graphics2D在图片上绘制文字,并实现自动换行的功能。
147 0
|
2月前
|
小程序
java--微信小程序发送模板消息
java--微信小程序发送模板消息
140 0
|
2月前
|
算法 Java 测试技术
数据结构 —— Java自定义代码实现顺序表,包含测试用例以及ArrayList的使用以及相关算法题
文章详细介绍了如何用Java自定义实现一个顺序表类,包括插入、删除、获取数据元素、求数据个数等功能,并对顺序表进行了测试,最后还提及了Java中自带的顺序表实现类ArrayList。
32 0
|
4月前
|
设计模式 缓存 算法
揭秘策略模式:如何用Java设计模式轻松切换算法?
【8月更文挑战第30天】设计模式是解决软件开发中特定问题的可重用方案。其中,策略模式是一种常用的行为型模式,允许在运行时选择算法行为。它通过定义一系列可互换的算法来封装具体的实现,使算法的变化与客户端分离。例如,在电商系统中,可以通过定义 `DiscountStrategy` 接口和多种折扣策略类(如 `FidelityDiscount`、`BulkDiscount` 和 `NoDiscount`),在运行时动态切换不同的折扣逻辑。这样,`ShoppingCart` 类无需关心具体折扣计算细节,只需设置不同的策略即可实现灵活的价格计算,符合开闭原则并提高代码的可维护性和扩展性。
70 2
|
4月前
|
小程序 Java
【aspose-words】Aspose.Words for Java模板语法详细剖析
本文通过详细分析Aspose.Words for Java模板语法,介绍了使用条件块、变量和动态合并表格单元格三个常用模板标签,并结合实际案例进行演示。通过这三个标签的实操,帮助读者更好地掌握Aspose.Words的使用技巧。此外,还提供了官方文档链接以便进一步学习。
162 0
【aspose-words】Aspose.Words for Java模板语法详细剖析
下一篇
DataWorks