Java算法模板 数据流快读

本文涉及的产品
云解析DNS,个人版 1个月
全局流量管理 GTM,标准版 1个月
公共DNS(含HTTPDNS解析),每月1000万次HTTP解析
简介: 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;
    }
    
}
 
 
 
目录
相关文章
|
1天前
|
算法 Java 机器人
Java数据结构与算法:动态规划之斐波那契数列
Java数据结构与算法:动态规划之斐波那契数列
|
1天前
|
算法 安全 Java
Java数据结构与算法:并发数据结构ConcurrentLinkedQueue
Java数据结构与算法:并发数据结构ConcurrentLinkedQueue
|
2天前
|
算法 Java
基于java雪花算法工具类SnowflakeIdUtils-来自chatGPT
基于java雪花算法工具类SnowflakeIdUtils-来自chatGPT
10 3
|
1天前
|
存储 算法 安全
Java中的DES和3DES加密算法详解
Java中的DES和3DES加密算法详解
|
1天前
|
搜索推荐 算法 Java
Java数据结构与算法:排序算法之冒泡排序
Java数据结构与算法:排序算法之冒泡排序
|
1天前
|
搜索推荐 算法 Java
Java数据结构与算法:排序算法之归并排序
Java数据结构与算法:排序算法之归并排序
|
1天前
|
搜索推荐 算法 Java
Java数据结构与算法:排序算法之插入排序
Java数据结构与算法:排序算法之插入排序
|
1天前
|
搜索推荐 算法 Java
Java数据结构与算法:排序算法之快速排序
Java数据结构与算法:排序算法之快速排序
|
1天前
|
算法 Java 机器人
Java数据结构与算法:查找算法之二分查找
Java数据结构与算法:查找算法之二分查找
|
1天前
|
Java BI C#
技术笔记:SM4加密算法实现Java和C#相互加密解密
技术笔记:SM4加密算法实现Java和C#相互加密解密