PhoneMe Advanced 浅度探索八----一张大图片:CVM的地图

听故事学语言 · 数据结构篇 · 第五章 藏在文件里的顺序与链 数据结构篇第五章,工业章一,前四章家当的实战回门。拖动进度条为什么秒跳,MP4 登记簿记位置供直达;FAT 文件分配表,链式存储的逻辑、数组实现的身体,1977 年马克·麦克唐纳为软盘设计它;进程档案链表轮转,一头进一头出,内核偏爱链表的连接自由;浏览器后退键,教科书的双向链表对工业界的数组加游标,同一个队形,两种站位法,谁赢谁的战场。 阅读详情

 

Mark Lam has been a virtual machine engineer in the JavaME CDC team at Sun Microsystems for over 6 years. Before joining Sun, he was a real-time embedded systems developer for 6+ years, working on application frameworks, graphics systems, networking protocols, game development, and fault tolerant systems amongst other things, on devices ranging from 64KB 8bit uControllers to 32-bit RISC machines.

原文URL:http://weblogs.java.net/blog/mlam/archive/2006/11/the_big_picture.html

 

         亲自的,当你接触一个新系统,第一件事是你想要搞清楚每一个东西是怎么结合在一起的。如果你像我一样是个虚拟思考者,最好的一条路就是画一个图表来说明你觉得重要的东西以及他们之间的联系。嵌入式系统的一个例子,以我的经验,知道内存里有什么在哪儿,系统资源是怎样使用的也同样重要,因此我画了一个数据结构的图表,下面:

CVM的世界参考物?

下面是怎么来读这张图

根数据结构

       CVM的一个设计标准是可重新启动,甚至当你在没有进程的OS上运行它。没有进程需求的可重启性,我们能够释放所有分配的内存。为了让生活更容易(它总是一个很好的实践),我们必须确保所有的数据从单一数据结构书的根上是可获得的。这个根数据结构是CVMglobals,你能在上面地图的左边看到。你会在globals.h和globals.c里找到CVMglobals的定义(也可以在这个文件里找到CVMGlobalState)。看下CVMglobals,你会发现它是一个系统全局数据结构的集合。保证全局在一个地方可以让它更容易恢复已知的初始值。例如:使用memsetting把所有的值设为0(在外面清理了所有的数据后)。

垃圾回收和Java堆栈:

       从全局,你可以找到一个内嵌的结构,它把握GC的配置和管理信息(CVMglobals.gc)。从这些,你最终可以得到Java heap。

       CVM有可插件的GC体系。插件是编译时的可插件性,不是运行时。它允许在CVM里根据实验来试验GC。当前,唯一一个有品质保证的CVM的GC是世代的(generational)GC(在这儿和这儿可以看到GC的细节执行文件)。

       所有的java对象,也就是所有从java.lang.Object扩展的对象,都从java heap上分配。只有一个例外就是ROMized Java objects。它们存在于全局数据。javaheap自己从C heap上分配。所有其它数据结构都从全局数据(i.e. .bss, .data, or their equivalents)或从C heap分配。

JIT和编译后代码

       CVMglobals为JIT(CVMglobals.jit)掌握配置和管理记录。通过树,你最后会找到JIT代码缓冲。这个代码缓存当前是固定大小的(通过运行时可配置)它在VM启动时分配。一旦它被分配,它的大小不能被改变。

       当java方法被JIT编译,编译器生产的比特(通常作为编译后方法提及)会存在代码缓存中。编译后方法的原数据(meta-data)(由JIT生成)也会存储在代码缓存中。因此,代码缓存的大小会规定,间接的,有多少方法能被编译。

Java对象和类

       当类文件装载到内存,内容主要被解析和组织到一个最佳的结构,它从C heap里分配。这个结构叫CVMClassBlock,它掌握所有类的元数据。原数据包括常量池,类属性,域和方法信息,bytecode等等。对每一个CVMClassBlock,有一个从java heap分配的java.lang.Class的实例。一旦一个类已经被装载,它们总是作为一对存在。类块(classblock)有一个参考对一个类,反之亦然。当一个类unload时,它们会一起被释放。

       CVM里的每一个java对象有一个2个字的头。第一个字包含了一个指针指向类块。无论如何,这个头对java代码不可见,它只对VM里的C方面可见。注意:自从java.lang.Class扩展自java.lang.Object后,类实例也有2个字的头

       查找关键文件在objects.h and classes.h。 看这儿。

Java线程

       要执行任何东西,VM必须有线程。每个java线程由CVMExecEnv表现(通常缩写成ee)。在VM,本质上ee是 线程的标示符。所有线程操作请求作为当前执行的线程的ee的参数。看interpreter.h 和 interpreter.c 

       这儿有一个一对一的映射关系在ee和java.lang.Thread实例之间。一旦线程被初始化,它们2个就作为一对存在。

       这儿有一个一对一的映射关系在ee和JNIEnv之间。JNIEnv是一个嵌入的,作为ee的一个域。ee和JNIEnv之间的映射地址的基本需求只是偏移调整。

       所有ee被装载在一个链表里。这个链表的头是CVMglobals.threadList。主线程的ee被做为嵌入域在CVMglobals被分配。

系统互斥

       VM线程列表的操作需要被同步。在VM里的其他子系统和资源都一样。同步一般都由CVMSysMutex(看sync.h和sync.c)。在VM启动时有几个系统互斥量(sysMutexes)被分配。这些互斥量只对VM的C代码可见。只能被C代码使用。

       每个互斥量都有明确的目的(CVMglobals.threadLock用来同步线程),它是有序的。为了防止死锁,系统互斥量只能在增加序号时被锁住。当CVM使用断言建立时,升序可以被断言。

Java执行堆

       一个执行的线程必须有一个执行堆。在CVM里,每一个Java线程有2个物理堆:一个本地堆,一个java堆。本地堆由系统分配,用于C代码执行。它掌握本地代码的活动记录(堆帧 stack frames),VM代码包括解释器循环功能。它掌握所有JIT编译后代码的活动帧。

    Java堆(也叫解释器堆)用来保存所有java方法的活动记录。每个java方法一执行,一个帧会推入堆中。堆和帧数据结构定义在stacks.h和stacks.c中。

    如果你在执行java方法时dump一个本地堆的跟踪,你会看到C代码的堆帧(stack frames)和解释器循环。如果你dump一个java堆,你只能看到java代码的堆帧当它们被调用时。如果你有一个本地方法在执行链(invocation chain),你可以看到本地堆和java堆的堆帧。这是因为本地方法是C功能和java方法的和。

GC根和根堆

在GC阶段,CVM被称为一个精确的VM。这意味着在GC时间,我们能够确切的知道所有的对象指针在系统的哪个地方。这和需要你猜测某个内存片包含对象指针和一些类似对象指针的随即数据的老式GC系统有鲜明的对比。

      VM里所有能获得的对象能够通过跟踪被叫做垃圾回收根树的对象参考树来找到。这个树从一个根参考开始。这些根参考本质上是全局的。用来存储被称为根堆(root stacks)的数据结构。有一个例子是CVMglobals.globalRoots。准确的说,这些数据结构不需要成为堆。它们被作为链表来使用。无论如何,我们的java堆数据结构有道具来实现GC根堆的需要,不要请求我们写附加的代码(为了代码效率),因此我们只使用堆。

       如果一个对象不能通过跟踪根树来找到,那么对象是不可到的,它可以被GC再生。

       注意在穿越树中,任何的点,一个节点都可能是新的子树的根。因此,term root或者GC根有时被用来指向一个对象指针/参考,它总能通过根查找来找到。GC根能在根堆里找到,在线成执行堆,在对象和类域里。

终了

      给了你们上面的主意足够让你们了解CVM里最主要的数据结构。注意:我告诉你们的大部分事给了你们一个很好的概念模型。实践上,这儿有一系列的原因来导致异常。某些时候,这些异常会打破规则。另外一些时候,他们看起来象是扩展了规则。为了保持事情简单,我忽略了它们。当我在谈到每个子系统或特殊的数据结构的时候我会详细讨论它们。

       在上面,我忽略了一些有趣的细节,比如为什么从C heap 分配数据结构相对于java heap。几天或几周后,我会放大CVM的子系统或数据结构,详细的讨论它们。这包括机械的细节作为设计体系。

祝有美好的一天!!
听故事学语言 · 数据结构篇 · 第六章 栈,后进先出的盒子 数据结构篇第六章,栈。二进制短除法余数为什么要倒着读,谜底是栈;括号匹配先让计数器上场,([)] 一串让它当场折戟,混括号必须栈;逆波兰记法,1924 年卢卡谢维奇发明波兰记法,1957 年汉布林把它倒过来;一件学生时代的四则运算器文物,带着一颗时发时不发的雷,当年调了很久怎么也跑不对,病没变,变的是它发不发作;双栈直接求值与随机表达式对数器一千组零不合;最小栈一步报最小,接雨水单调栈一层一层结算;汉诺塔的调用栈真身,V 字图退役;火车进出站十四种可能,卡塔兰数;链栈与共享栈收章。 阅读详情

相关推荐

数字电路基础(CMOS电路、低功耗方法)

文章目录一、CMOS器件1.1.CMOS反相器1.2. CMOS与非门1.3.CMOS或非门1.4 CMOS与门和CMOS或门二、CMOS电路参数——功耗 一、CMOS器件 1.1.CMOS反相器 CMOS反相器实现非门功能,由一个PMOS管和一个NMOS管组成,其逻辑电路图如下: 其真值表如下: In PMOS NMOS Out 0 √ 导通 ×关闭 1 1 ×关闭 √...

Mr.翟的博客 1万+

通过wav文件和text文件训练出phoneme文件的过程

环境:python2.7和python3.6 最近训练的一个神经网络需要wav文件和phn文件作为自己输入。 所有的数据库中都有wav文件,但是phoneme文件却不是每个数据库都有。 TIMIT数据库中就PHN文件。 先贴个PHN文件的图。 SX127.PHN 再看一下这句话的文本。 后面就是这句话没问题,0-24679肯定就是时间了。 我们看到时间是

weixin_40128276的博客 982

Appstore 3.2(f)违规自救指南:从触发到申诉的完整应对策略

本文详细解析了Appstore 3.2(f)违规的应对策略,从触发原因到申诉流程,帮助开发者有效自救。文章涵盖隐瞒行为、账户关联和信息造假三大违规场景的判定逻辑,并提供申诉信写作的黄金法则和长期合规防御措施,确保开发者能够顺利通过苹果审核。

weixin_29304985的博客 664

PhoneMe Advanced 代码浅读一----CVM启动和初始化过程

导读:   Jiangli Zhou joined Sun Microsystems in 1999. She has been in the J2ME CDC VM (CVM) team since 2000. Over the years, she has worked on various areas in the VM, including ROMizer, classloader

xu的blog 1534

Ubuntu18.04 SoftRoCE安装教程

目标:创建两台Ubuntu18.04虚拟机,安装SoftRoCE环境,一台作为Server,一台作为Client,模拟RDMA通信环境,熟悉RDMA的通信方式。

GGGYL111的博客 1551

NRF52832串口通信避坑指南:从SDK配置到硬件流控(RTS/CTS)实战

本文详细介绍了NRF52832串口通信的实战指南,从SDK配置到硬件流控(RTS/CTS)的完整实现。通过分析UARTE模块特性、解决SDK版本差异问题、正确配置硬件引脚以及实现稳定通信的代码示例,帮助开发者避开常见陷阱,确保高效可靠的串口通信。特别强调了硬件流控在高速通信中的重要性及其实践方法。

weixin_33739646的博客 283

头歌 数据结构-串的表示与实现

本关任务是实现串的定长顺序存储结构。使用静态数组char arr[MaxLen]存储字符串,输入字符串后输出其内容、实际长度(通过strlen计算)和存储长度(sizeof(arr))。代码在Begin-End间补充,完成字符串读取与信息输出。测试用例为输入"aaaaa",预期输出为"aaaaa"、5、20。

一名敲代码的苦13程序员 106

CorelDRAW 2019安装指南:从下载到激活的完整步骤

本文提供了一份详细的CorelDRAW 2019安装指南,涵盖从下载安装包、检查系统环境到完成激活的完整步骤。文章重点解析了安装过程中的关键选项设置,并分享了首次启动后的优化配置与常见问题解决方案,旨在帮助用户高效、顺利地完成这款经典矢量设计软件的安装与配置。

weixin_29213827的博客 847

《考研408数据结构》第八章(排序)复习笔记

真题100%选择必考多个算法的特点比较!!必须汇总!!实在记不住谁和【初始状态有关】时就举例子:1、当数组完全有序时;2、当数组完全逆序时;3、快速排序数组第1个枢轴是最小/最大值。

m0_73991249的博客 171

【渗透工具】内网多级代理工具Venom详细使用教程

Venom是一款为渗透测试人员设计的使用Go开发的多级代理工具。Venom可将多个节点进行连接,然后以节点为跳板,构建多级代理。渗透测试人员可以使用Venom轻松地将网络流量代理到多层内网,并轻松地管理代理节点。

TT小子的博客 3757

[官方培训]19-物理模拟 Epic 肖月 笔记

物理引擎全局解算精度的设置,帧率越高,子步越多得到的模拟结果就越精确。引擎默认情况下是以变化的帧率运行的,但是对于Chaos物理引擎来说。一般子步越小,帧率越固定,效果就会更好更稳定一些。图示的分步选项就是依据下方的最长子步时长和最大步数对动态变化的帧率,进一步的做拆分来保证物理效果。对于影视项目建议都开启分步选项。红色框内有三个迭代次数的设置,这是Chaos基于位置的约束求解算法专用的一个设置,可以简单理解为迭代次数越高,当前帧一个子步内得到的结果就越精确。

Tcohneyn的博客 1546

【数据结构-5】单链表的实现

单链表,具体来说是单向的、不带头的、不循环的链表。链表由一个一个节点组成,每个节点分为数据域和指针域,数据域存放数据,指针域存放下一节点的地址。这样,就可以根据指针域中的地址找到下一个节点,节点就串起来了构成了单链表。

a bit 216

本地通知与健康数据的隐私保护方案

随着移动健康(mHealth)应用的普及,本地通知与健康数据的结合为用户提供了更加个性化的健康管理体验。然而,这种便利性也带来了严峻的隐私保护挑战。本文旨在探讨如何在移动应用中实现本地通知功能的同时,确保用户健康数据的隐私安全。本地通知与健康数据结合的技术架构隐私保护的核心技术方案具体算法实现与数学模型实际应用案例分析本文首先介绍背景知识和核心概念,然后深入探讨隐私保护的技术方案,包括算法原理和数学模型。接着提供实际代码实现和应用场景分析,最后讨论未来发展趋势和挑战。

移动开发前沿的博客 1309

C++ 数据结构与面向对象:二叉搜索树实现与多态虚函数详解

本文系统讲解二叉搜索树(BST)的迭代实现与C++多态及虚函数底层原理。BST通过非递归方式实现插入、查找、删除,核心在于维护有序性,删除分三种情况处理,替换法为关键技巧。多态基于虚函数表(vtable)与虚函数指针(vfptr),通过基类指针调用重写函数实现运行时动态绑定,需满足继承与虚函数重写条件。抽象类强制接口规范,虚函数表存储函数地址,子类继承或覆盖对应项。二者分别体现数据结构高效性与面向对象灵活性,是C++核心知识点。

2603_95129722的博客 212

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

数据结构的基本概念和算法的初步认识

本文系统阐述数据结构与算法的基础概念,涵盖数据、数据元素、数据对象的层次关系,数据结构的三要素(逻辑结构、存储结构、数据运算),以及抽象数据类型。重点解析算法的特性与设计要求,并深入讲解时间复杂度分析的核心——大O表示法,通过“只保留最高阶项、忽略常数系数、取最坏情况”三大原则,结合实例剖析O(1)、O(n)等常见时间复杂度,揭示算法效率的本质评估方法。

ACH_YYX的博客 204

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

数据结构:二叉树,递归转迭代

二叉树的先序遍历,不需要额外信息保存,因为不用返回到父节点,因为已经处理完了,右左右子节点已在栈上,信息够了。而中序与后序是需要保存额外信息的。通用方法中,用一个栈帧保存当前的一些数据,比如局部变量,返回值等,完全是机械式翻译。

憧憬,思考,奋斗,飞翔 192

【计算基础|Redis06】底层数据结构

本文详解Redis 7.4底层数据结构设计:以SDS替代C字符串实现O(1)长度查询与二进制安全;ZSet采用跳表+哈希表组合,兼顾排序与快速查找;小对象用listpack取代ziplist,根除连锁更新问题;List通过quicklist融合紧凑与链表优势;哈希表采用渐进式rehash避免阻塞;整数集合使用intset节省内存。结合OBJECT ENCODING实测,直观展示数据从紧凑编码(int/embstr/listpack)自动切换至通用编码(raw/hashtable)的过程,体现“小则省、大则快

花间相见的博客 344

CF2283F[数据结构]

首先考虑一种暴力解法,当我们建好i之前的图后,当我们添加i的时候,区间[li,ri]中的点都会向i建边,但是这些点中,如果有某两个顶点l,r,满足l<r,那么l就可以通过r间接到达i,因此可以删除l到i的边;初始时我们令所有点放入set中,然后对于每一个i的处理,我们将集合中仍在[l,r]的范围的点弹出,并且将f设置为i,这样我们就得到了所有点的最小跳板;对于每个区间[l,r] 我们要计算这下下标中的f(v)中大于r的数目有多少个;我们令f(v)表示顶点v可到达的最小的顶点;

蒟蒻 164

笔记-论数据结构2

typedef 数据类型 别名return 0;typedef也经常用在结构体上:每次声明结构体变量都要写struct关键字,很麻烦,而且逻辑上也很难受,typedef可以解决这个问题。int x;int y;p.x = 5;p.y = 10;return 0;而利用typedef解决有两种解法:typedef struct 结构体名数据类型 变量名;数据类型 变量名;……}别名;数据类型 变量名;数据类型 变量名;……}别名;实际的运用int x;

fish_zzzz的博客 124

头歌 数据结构-C&C++ 数组实训

本系列任务围绕数组应用展开:第1关统计销售额波动,通过一维数组存储每日数据并计算相邻差值;第2关求最大销售增幅,利用遍历与动态更新最小值和最大增益;第3关模拟“猴子选大王”游戏,通过循环报数剔除编号为3的猴子直至剩一人;第4关计算整数“犯二程度”,将大数以字符串形式处理,统计‘2’的个数并根据符号与奇偶性调整比值。各关均强化数组操作、循环逻辑与边界处理能力。

一名敲代码的苦13程序员 361

关于算法用现成数据结构和手撕

使用Java内置PriorityQueue实现大顶堆求第K大元素,因涉及自动装箱、对象开销及底层数组扩容,效率较低;而手写原地大顶堆直接操作原始int数组,避免装箱拆箱与额外对象,时间复杂度更优。实测显示,手撕堆显著提速,体现底层优化的重要性。

Pniubi的博客 249

数据结构:排序

将一组无序的记录(数据元素),按照某个关键字(key)递增或递减的顺序重新排列。

橘为己有的博客 512

【前缀和+复合离散化】题解:双色矩形(two)_数据结构_算法优化_预处理_二维前缀和_STL_C++算法竞赛

给定一个 $n \times n$ 的黑白棋盘,初始按 $i+j$ 奇偶染色,经 $k$ 个格子颜色翻转后,求子矩形中黑白格子数差的绝对值最大值。由于 $n$ 可达 $10^9$,但 $k \leq 50$,可离散化关键点。枚举所有由修改点构成的矩形及其四边向外扩展(共 $16$ 种扩展方式),利用二维前缀和快速计算变化量,结合奇偶性判断多出的格子颜色,最终取最大绝对差。时间复杂度为 $O(k^4)$,在 $k \leq 50$ 下可行。

YLCHUP的博客 209

数据结构之图的存储与遍历

本文系统讲解图的存储与遍历核心内容:邻接矩阵(适合稠密图,O(n²)空间)与邻接表(适合稀疏图,O(n+e)空间)两种存储方式;以及广度优先遍历(BFS,队列实现)和深度优先遍历(DFS,递归/非递归双实现)两种遍历算法。强调visited数组防重复、遍历序列不唯一等高频考点,为最小生成树、最短路径、拓扑排序等进阶内容打下基础,是考研与面试必掌握的核心知识点。

qq_34097230的博客 304

CDGA DMBOK 第5章——数据建模和设计:如何将业务需求转化为规范的数据结构

本章系统阐述数据建模与设计的核心方法,强调将业务需求转化为规范数据结构的全过程。重点涵盖数据模型三层次(概念、逻辑、物理)、实体关系模型(ER)及主键、外键等核心要素,深入解析第一至第三范式,阐明规范化在消除冗余、保障数据一致性的关键作用,并介绍反规范化在性能优化中的合理应用。通过“概念看业务、逻辑看结构、物理看实现”的逻辑框架,实现从需求到数据库落地的完整闭环。

积跬步,慕至千里的博客 319

数据结构-跳表

本文介绍随机跳表的结构与实现,通过概率决定节点层数,支持高效查找、插入和删除操作。查询时从高层向低层逐层推进,平均时间复杂度为O(log n)。代码实现包含头结点、随机层数生成、多层指针维护及层高动态调整,确保空间效率与性能平衡。

fish_xk的博客 228
上一篇: PPhoneMe Advanced 浅度探索一----PhoneME Advanced 目录结构
下一篇: PhoneMe Advanced 浅度探索七 ----JAVA平台的多任务:什么是大交易?
普通网友
普通网友 领域专家: 编程技术技术领域 领域专家: 编程技术技术领域
博客等级 码龄25年 2837粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值