Java高级编程技术详解:从多线程到算法优化的全面指南

复杂度与优化

复杂度与优化在算法中的应用

算法复杂度是衡量算法效率的重要指标。了解和优化算法复杂度对提升程序性能非常关键。本文将介绍时间复杂度和空间复杂度的基本概念,并探讨一些优化技术。

时间复杂度和空间复杂度

时间复杂度表示算法执行所需时间随输入规模变化的情况,通常用大O符号表示。常见的时间复杂度有O(1)、O(log n)、O(n)、O(n log n)、O(n²)等。

空间复杂度表示算法运行过程中占用的存储空间,常见的空间复杂度有O(1)、O(n)等。

示例代码:计算一个数组中最大值的时间复杂度

public class MaxValue {/*** 找到数组中的最大值* @param arr 输入数组* @return 数组中的最大值*/public static int findMax(int[] arr) {int max = arr[0];  // 假设第一个元素是最大值for (int value : arr) {  // 遍历数组if (value > max) {max = value;  // 更新最大值}}return max;}public static void main(String[] args) {int[] numbers = {1, 3, 5, 7, 9};System.out.println("Max value: " + findMax(numbers));  // 输出最大值}
}

上述代码的时间复杂度为O(n),空间复杂度为O(1)。

优化技术
  1. 减少不必要的计算:在循环中避免重复计算,尽量将不变的计算移出循环。
  2. 使用高效的数据结构:如哈希表、堆等,这些数据结构能在某些情况下显著降低时间复杂度。

示例代码:使用哈希表优化查找

import java.util.HashMap;
import java.util.Map;public class FindPair {/*** 判断数组中是否存在两个元素的和等于目标值* @param arr 输入数组* @param target 目标和* @return 如果存在这样的元素,返回true;否则返回false*/public static boolean hasPairWithSum(int[] arr, int target) {Map<Integer, Integer> map = new HashMap<>();for (int num : arr) {  // 遍历数组if (map.containsKey(target - num)) {return true;  // 找到一对满足条件的元素}map.put(num, 1);  // 记录当前元素}return false;  // 没有找到满足条件的元素}public static void main(String[] args) {int[] numbers = {1, 3, 5, 7, 9};int target = 8;System.out.println("Pair with sum " + target + ": " + hasPairWithSum(numbers, target));  // 输出是否存在满足条件的元素}
}

上述代码的时间复杂度为O(n),空间复杂度为O(n)。

并行与分布式算法

Java中的并行与分布式算法

并行和分布式算法在处理大规模数据和高性能计算中起到关键作用。本文将介绍Java中的并行处理技术和MapReduce算法。

并行算法

Java提供了多种并行处理的工具,包括java.util.concurrent包和Fork/Join框架。

示例代码:Fork/Join框架

import java.util.concurrent.RecursiveTask;
import java.util.concurrent.ForkJoinPool;public class SumTask extends RecursiveTask<Integer> {private final int[] arr;private final int start, end;/*** 构造函数,初始化待处理的数组区间* @param arr 输入数组* @param start 起始位置* @param end 结束位置*/public SumTask(int[] arr, int start, int end) {this.arr = arr;this.start = start;this.end = end;}@Overrideprotected Integer compute() {if (end - start <= 10) {  // 如果任务规模小于等于10,则直接计算int sum = 0;for (int i = start; i <= end; i++) {sum += arr[i];}return sum;} else {  // 否则分解任务int mid = (start + end) / 2;SumTask leftTask = new SumTask(arr, start, mid);SumTask rightTask = new SumTask(arr, mid + 1, end);leftTask.fork();  // 异步执行左子任务return rightTask.compute() + leftTask.join();  // 等待左子任务执行完毕并合并结果}}public static void main(String[] args) {int[] numbers = new int[100];for (int i = 0; i < 100; i++) {numbers[i] = i + 1;}ForkJoinPool pool = new ForkJoinPool();int sum = pool.invoke(new SumTask(numbers, 0, numbers.length - 1));  // 提交任务给ForkJoinPool执行System.out.println("Sum: " + sum);  // 输出求和结果}
}

分布式算法

MapReduce是一种分布式算法,用于处理大规模数据集。

示例代码:简单MapReduce实现

import java.util.*;
import java.util.stream.Collectors;public class SimpleMapReduce {/*** Map阶段,统计文档中的单词频率* @param documents 输入文档数组* @return 单词频率的映射*/public static Map<String, Integer> map(String[] documents) {Map<String, Integer> wordCount = new HashMap<>();for (String doc : documents) {String[] words = doc.split("\\s+");for (String word : words) {wordCount.put(word, wordCount.getOrDefault(word, 0) + 1);}}return wordCount;}/*** Reduce阶段,合并所有映射中的单词频率* @param maps 单词频率映射的列表* @return 合并后的单词频率映射*/public static Map<String, Integer> reduce(List<Map<String, Integer>> maps) {Map<String, Integer> finalCount = new HashMap<>();for (Map<String, Integer> map : maps) {for (Map.Entry<String, Integer> entry : map.entrySet()) {finalCount.put(entry.getKey(), finalCount.getOrDefault(entry.getKey(), 0) + entry.getValue());}}return finalCount;}public static void main(String[] args) {String[] docs = {"hello world", "hello java", "java concurrency"};List<Map<String, Integer>> maps = Arrays.stream(docs).map(SimpleMapReduce::map).collect(Collectors.toList());Map<String, Integer> result = reduce(maps);result.forEach((k, v) -> System.out.println(k + ": " + v));  // 输出合并后的单词频率}
}

图算法

Java中的高级图算法

图算法在解决诸如网络流、最短路径等问题时非常有用。本文将介绍一些高级图算法及其Java实现。

网络流算法

最大流算法用于计算网络中的最大流量。Ford-Fulkerson方法是一种经典的最大流算法。

示例代码:Ford-Fulkerson算法

import java.util.LinkedList;
import java.util.Queue;public class FordFulkerson {private static final int V = 6; // 图中的顶点数/*** 使用广度优先搜索查找增广路径* @param rGraph 残余图* @param s 源点* @param t 汇点* @param parent 存储路径的数组* @return 如果存在增广路径,返回true;否则返回false*/boolean bfs(int[][] rGraph, int s, int t, int[] parent) {boolean[] visited = new boolean[V];Queue<Integer> queue = new LinkedList<>();queue.add(s);visited[s] = true;parent[s] = -1;while (!queue.isEmpty()) {int u = queue.poll();for (int v = 0; v < V; v++) {if (!visited[v] && rGraph[u][v] > 0) {queue.add(v);parent[v] = u;visited[v] = true;}}}return visited[t];}/*** 使用Ford-Fulkerson算法计算最大流量* @param graph 输入图* @param s 源点* @param t 汇点* @return 最大流量*/int fordFulkerson(int[][] graph, int s, int t) {int[][] rGraph = new int[V][V]; // 残余图for (int u = 0; u < V; u++) {for (int v = 0; v < V; v++) {rGraph[u][v] = graph[u][v];}}int[] parent = new int[V];int maxFlow = 0;while (bfs(rGraph, s, t, parent)) {int pathFlow = Integer.MAX_VALUE;for (int v = t; v != s; v = parent[v]) {int u = parent[v];pathFlow = Math.min(pathFlow, rGraph[u][v]);}for (int v = t; v != s; v = parent[v]) {int u = parent[v];rGraph[u][v] -= pathFlow;rGraph[v][u] += pathFlow;}maxFlow += pathFlow;}return maxFlow;}public static void main(String[] args) {int[][] graph = {{0, 16, 13, 0, 0, 0},{0, 0, 10, 12, 0, 0},{0, 4, 0, 0, 14, 0},{0, 0, 9, 0, 0, 20},{0, 0, 0, 7, 0, 4},{0, 0, 0, 0, 0, 0}};FordFulkerson ff = new FordFulkerson();System.out.println("Maximum flow: " + ff.fordFulkerson(graph, 0, 5));  // 输出最大流量}
}
最短路径算法

Dijkstra算法用于计算图中从源点到其他顶点的最短路径。

示例代码:Dijkstra算法

import java.util.Arrays;
import java.util.PriorityQueue;public class Dijkstra {private static final int V = 9;/*** 使用Dijkstra算法计算最短路径* @param graph 输入图* @param src 源点*/void dijkstra(int[][] graph, int src) {int[] dist = new int[V];boolean[] sptSet = new boolean[V];Arrays.fill(dist, Integer.MAX_VALUE);dist[src] = 0;PriorityQueue<Node> pq = new PriorityQueue<>(V, (a, b) -> a.cost - b.cost);pq.add(new Node(src, 0));while (!pq.isEmpty()) {int u = pq.poll().vertex;sptSet[u] = true;for (int v = 0; v < V; v++) {if (!sptSet[v] && graph[u][v] != 0 && dist[u] != Integer.MAX_VALUE && dist[u] + graph[u][v] < dist[v]) {dist[v] = dist[u] + graph[u][v];pq.add(new Node(v, dist[v]));}}}printSolution(dist);}/*** 打印最短路径结果* @param dist 最短路径数组*/void printSolution(int[] dist) {System.out.println("Vertex\tDistance from Source");for (int i = 0; i < V; i++) {System.out.println(i + "\t" + dist[i]);}}public static void main(String[] args) {int[][] graph = {{0, 4, 0, 0, 0, 0, 0, 8, 0},{4, 0, 8, 0, 0, 0, 0, 11, 0},{0, 8, 0, 7, 0, 4, 0, 0, 2},{0, 0, 7, 0, 9, 14, 0, 0, 0},{0, 0, 0, 9, 0, 10, 0, 0, 0},{0, 0, 4, 14, 10, 0, 2, 0, 0},{0, 0, 0, 0, 0, 2, 0, 1, 6},{8, 11, 0, 0, 0, 0, 1, 0, 7},{0, 0, 2, 0, 0, 0, 6, 7, 0}};Dijkstra dijkstra = new Dijkstra();dijkstra.dijkstra(graph, 0);  // 从源点0计算最短路径}class Node {int vertex;int cost;public Node(int vertex, int cost) {this.vertex = vertex;this.cost = cost;}}
}

机器学习与深度学习

Java中的机器学习与深度学习

机器学习和深度学习在现代数据分析中非常重要。本文将介绍如何在Java中实现简单的神经网络,以及如何使用DL4J进行深度学习。

简单的神经网络

一个简单的神经网络可以通过矩阵运算实现。

示例代码:简单的神经网络实现

import java.util.Random;public class SimpleNeuralNetwork {private final double[][] weights;/*** 构造函数,初始化神经网络的权重* @param inputSize 输入层大小* @param outputSize 输出层大小*/public SimpleNeuralNetwork(int inputSize, int outputSize) {weights = new double[inputSize][outputSize];Random rand = new Random();for (int i = 0; i < inputSize; i++) {for (int j = 0; j < outputSize; j++) {weights[i][j] = rand.nextDouble();}}}/*** 预测函数,计算输出* @param inputs 输入数据* @return 输出数据*/public double[] predict(double[] inputs) {double[] outputs = new double[weights[0].length];for (int i = 0; i < weights[0].length; i++) {outputs[i] = 0;for (int j = 0; j < weights.length; j++) {outputs[i] += inputs[j] * weights[j][i];}}return outputs;}public static void main(String[] args) {SimpleNeuralNetwork nn = new SimpleNeuralNetwork(3, 2);double[] inputs = {1.0, 0.5, -1.0};double[] outputs = nn.predict(inputs);for (double output : outputs) {System.out.println(output);}}
}
使用DL4J进行深度学习

DL4J(Deeplearning4j)是Java中流行的深度学习库。下面的代码展示了如何使用DL4J训练一个简单的神经网络。

示例代码:使用DL4J进行深度学习

import org.deeplearning4j.datasets.iterator.impl.MnistDataSetIterator;
import org.deeplearning4j.nn.api.OptimizationAlgorithm;
import org.deeplearning4j.nn.conf.MultiLayerConfiguration;
import org.deeplearning4j.nn.conf.NeuralNetConfiguration;
import org.deeplearning4j.nn.conf.layers.DenseLayer;
import org.deeplearning4j.nn.conf.layers.OutputLayer;
import org.deeplearning4j.nn.multilayer.MultiLayerNetwork;
import org.deeplearning4j.optimize.api.IterationListener;
import org.deeplearning4j.optimize.listeners.ScoreIterationListener;
import org.nd4j.linalg.api.ndarray.INDArray;
import org.nd4j.linalg.dataset.api.iterator.DataSetIterator;
import org.nd4j.linalg.factory.Nd4j;
import org.nd4j.linalg.learning.config.Sgd;
import org.nd4j.linalg.lossfunctions.LossFunctions;public class DL4JExample {public static void main(String[] args) throws Exception {int inputSize = 784;int outputSize = 10;int batchSize = 128;int epochs = 5;DataSetIterator mnistTrain = new MnistDataSetIterator(batchSize, true, 12345);MultiLayerConfiguration conf = new NeuralNetConfiguration.Builder().seed(123).optimizationAlgo(OptimizationAlgorithm.STOCHASTIC_GRADIENT_DESCENT).updater(new Sgd(0.1)).list().layer(new DenseLayer.Builder().nIn(inputSize).nOut(1000).activation("relu").build()).layer(new OutputLayer.Builder(LossFunctions.LossFunction.NEGATIVELOGLIKELIHOOD).nIn(1000).nOut(outputSize).activation("softmax").build()).build();MultiLayerNetwork model = new MultiLayerNetwork(conf);model.init();model.setListeners(new ScoreIterationListener(10));for (int i = 0; i < epochs; i++) {model.fit(mnistTrain);}// 评估模型性能DataSetIterator mnistTest = new MnistDataSetIterator(batchSize, false, 12345);Evaluation eval = new Evaluation(outputSize);while (mnistTest.hasNext()) {DataSet ds = mnistTest.next();INDArray output = model.output(ds.getFeatureMatrix());eval.eval(ds.getLabels(), output);}System.out.println(eval.stats());}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/28846.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LVS – NAT 模式集群构建

目录 1 环境准备 1.1 准备四台服务器 1.2 IP与网关均按照下图配置 1.3 网卡配置 1.4 real server 安装 web服务 1.5 安装ipvsadm 管理工具 2 使用ipvsadm管理LVS 2.1 创建集群指定使用的算法 2.2 添加真实服务器指定工作原理 2.3 查看是否正确创建集群 2.4 开启FORWARD路由转发…

每日一练 - PIM协议报文类型辨析

01 真题题目 在 PIM 协议中可能存在的报文是&#xff1a; A. JOIN/PRUNE B. ASSERT C. BOOTSTRAP D. REGISTER 02 真题答案 AB 03 答案解析 PIM&#xff08;Protocol Independent Multicast&#xff09;协议有两个主要的操作模式&#xff1a;PIM-Dense Mode (PIM-DM) 和 PIM…

​一个高清影像下载插件

数据是GIS的血液&#xff01; 虽然我们在水经微图&#xff08;简称“微图”&#xff09;中可以下载各种各样丰富的地图数据&#xff0c;但相信大家对数据的追求是无止境的。 我们现在就来分享一下&#xff0c;如何在QGIS中下载高清卫星影像的方法。 如果你需要最新版本的QGI…

最新下载:Hype 4 mac版【软件附加安装教程】

Hype是一款强大的Mac OS平台 HTML5 创作工具&#xff0c;它可以在网页上做出赏心悦目的动画效果&#xff0c;创建丰富的网页交互动画&#xff0c;支持层、时间轴等编辑方式&#xff0c;并能很好的导出HTML5/CSS3/JavaScript&#xff0c;在台式机&#xff0c;智能手机和iPad上流…

一、sorted()函数的使用

numbers[2,23,1,3,434,23,23] demosorted(numbers)#正常升序 print("\n") print(demo) demo1sorted(numbers,reverseTrue)#加上reverse变为降序 demo2sorted(numbers,reverseFalse)#加上reverse变为降序 print(demo1) print(demo2)#reverse默认为False names[Addf,aD…

裁剪图片的最简单方法?这四种裁剪方法真的超级简单!

裁剪图片的最简单方法&#xff1f;在丰富多彩的现代生活中&#xff0c;图片成为了我们表达、沟通甚至展示身份的重要媒介&#xff0c;然而&#xff0c;无论是出于个人审美还是专业需求&#xff0c;图片的格式和尺寸往往成为了我们不得不面对的问题&#xff0c;特别是那些未经雕…

flink1.12.0学习笔记(一)-部署与入门

flink1.12.0学习笔记&#xff08;1&#xff09;-部署与入门 1-1-Flink概述 Flink诞生 Flink 诞生于欧洲的一个大数据研究项目 StratoSphere。该项目是柏林工业大学的一个研究性项目。早期&#xff0c; Flink 是做 Batch 计算的&#xff0c;但在 2014 年&#xff0c; StratoS…

mathtype7.6官方无需激活版安装包下载

大家好&#xff0c;今天我要和大家分享的是一款非常实用的数学工具——mathtype7.6最新版本&#xff01;&#x1f4d0; 作为一个数学专业的学生&#xff0c;我经常需要处理大量的数学公式和符号。以前我都是用手写或者电脑自带的公式编辑器&#xff0c;但是效率低下而且容易出错…

React中数据响应式原理

React作为当下最流行的前端框架之一&#xff0c;以其声明式编程和组件化架构而广受开发者喜爱。而React的数据响应式原理&#xff0c;是其高效更新DOM的核心机制。本文将深入探讨React中数据响应式原理&#xff0c;并结合代码示例进行论证。 响应式原理概述 在React中&#x…

课设--学生成绩管理系统(二)

欢迎来到 Papicatch的博客 目录 &#x1f40b;引言 &#x1f988;编写目的 &#x1f988;项目说明 &#x1f40b;产品介绍 &#x1f988;产品概要说明 &#x1f988;产品用户定位 &#x1f988;产品中的角色 &#x1f40b; 产品总体业务流程图 &#x1f40b; 产品功…

装机必备-WinRAR安装教程

软件介绍&#xff1a;WinRAR 是一款功能强大的压缩包管理器&#xff0c;可用于备份数据&#xff0c;缩减电子邮件附件的大小&#xff0c;解压缩从 Internet 上下载的RAR、ZIP及其它类型文件&#xff0c;新建 RAR 及 ZIP 格式等的压缩类文件。这是我们新电脑或重装系统后必须安装…

Redis 分布式锁过期了,还没处理完怎么办?

为了防止死锁&#xff0c;我们会给分布式锁加一个过期时间&#xff0c;但是万一这个时间到了&#xff0c;我们业务逻辑还没处理完&#xff0c;怎么办&#xff1f; 这是一个分布式应用里很常见到的需求&#xff0c;关于这个问题&#xff0c;有经验的程序员会怎么处理呢&#xff…

c++ 笔记二

1.可变参数和限制输入&#xff1a; 代码&#xff1a;不限制输入&#xff0c;返回的总和 #include <iostream> #include <filesystem> #include <string> #include <vector>template<class Type> concept AddAble requires(Type T1, Type T2) …

adb常用命令详解--提升开发效率利器

文章目录 文件管理截屏与录屏logcat 使用dumpsys 相关ps 相关am 相关pm 相关wm 相关setprop 设置属性input 相关adb connect 远程无线调试其它 本文首发地址 https://h89.cn/archives/281.html 最新更新地址 https://gitee.com/chenjim/chenjimblog 博主 Linux 使用较多&#x…

04 翼型和机翼、尾翼几何选择

04 翼型和机翼、尾翼几何选择 4 -1 引言4-2 翼型的选择4-2-1 翼型的几何4-2-2 翼型的升力和阻力4-2-3 翼型选择与设计4-2-4 设计升力系数4-2-5 失速4-2-6 翼型厚度比4-2-7 关于翼型其他方面的考虑 4-3 机翼几何外形4-3-1 展弦比4-2-3 机翼后掠角4-3-3 机翼稍根比4-3-4 机翼扭转…

团结的力量:友情、互助与感恩

时间如白驹过隙&#xff0c;半载光阴转瞬即逝。回首过去的六个月&#xff0c;在CSDN平台上&#xff0c;我经历了无数的挑战和成长。在大厂和阿豪的帮助下&#xff0c;我的粉丝数终于突破了万大关。这不仅是我个人的成就&#xff0c;更是我们团结、互助和感恩精神的见证。 初识…

aardio实战篇) 下载微信公众号文章为pdf和html

首发地址&#xff1a; https://mp.weixin.qq.com/s/w6v3RhqN0hJlWYlqTzGCxA 前言 之前在PC微信逆向) 定位微信浏览器打开链接的call提过要写一个保存公众号历史文章的工具。这篇文章先写一个将文章保存成pdf和html的工具&#xff0c;后面再补充一个采集历史的工具&#xff0c…

HTTP协议版本历程

HTTP协议的发展历程 版本推出年份当前状态HTTP/0.91991年已过时HTTP/1.01996年已过时HTTP/1.11997年标准HTTP/2.02015年标准HTTP/3.02022年标准 HTTP/0.9 HTTP/0.9非常简单&#xff0c;并不涉及数据包传输&#xff0c;通过请求和响应的交换达成通信&#xff0c;请求由单行指…

SmartEDA、Multisim、Proteus大比拼:电路设计王者之争?

在电路设计领域&#xff0c;SmartEDA、Multisim和Proteus无疑是三款备受瞩目的软件工具。它们各自拥有独特的功能和优势&#xff0c;但在这场电路设计王者的竞争中&#xff0c;谁才是真正的领跑者&#xff1f;让我们深入探究这三款软件的异同&#xff0c;揭示它们各自的魅力所在…

小抄 20240611

1 不要总是问“什么项目靠谱”“什么行业有前途”&#xff0c;这些东西对普通人没有太大参考意义&#xff0c;每个看上去靠谱的行业&#xff0c;都有可能变得不靠谱&#xff0c;重要的是&#xff0c;让自己变得靠谱&#xff0c;人靠谱&#xff0c;干什么事都能靠谱。 2 普通人…