你知道文件索引、数据库索引一般用什么数据结构来存储吗?
小秋:知道啊,一般都是用树形结构来存储的。
面试官:可以说说为啥用树形结构来存储吗?
小秋:树形结构例如想 B 树,B+ 树,二叉查找树都是有序的,所以查询效率很高,可以再 O(logn) 的时间复杂度查找到目标数据。
面试官:那可以问问文件索引,例如数据库索引一般用哪种树形结构吗?
小秋:大部分用 B+ 树,少部分用 B 树。(B和B+树太他么复...
阅读全文
对于栈的认识,相信每个学习数据结构的小伙伴多多少少有一定的认识和了解。很多刚刚学习的小伙伴说学习数据结构在实际中没怎么见到应用,那是因为你没有去仔细的观察,而且像栈这常用到的数据结构通常会使用在实际开发中,比如:表达式的运算、花括号的匹配以及浏览器的前进后退等等很多。
这些实际开发的实现如果不去研究,你永远不知道数据结构在实际中的应用,当你学习完今天的栈数据结构时,然后去研究下实际中已经...
阅读全文
一、进程、线程、多线程概念
1、进程(process)
狭义定义:进程就是一段程序的执行过程。
广义定义:进程是一个具有一定独立功能的程序关于某个数据集合的一次运行活动。它是操作系统动态执行的基本单元,在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。
简单的来讲进程的概念主要有两点:第一,进程是一个实体。每一个进程都有它自己的地址空间,一般情况下,包括文本区域(text region)...
阅读全文
在前一篇文章中通过leetcode的一道题目了解了LRU算法的具体设计思路,下面继续来探讨一下另外两种常见的Cache算法:FIFO、LFU、LRU算法。
1.FIFO算法
FIFO(First in First out),先进先出。其实在操作系统的设计理念中很多地方都利用到了先进先出的思想,比如作业调度(先来先服务),为什么这个原则在很多地方都会用到呢?因为这个原则简单、且符合人们的惯性思维,具备公平性,并且实现起来简单,直接使用数据结构中...
阅读全文
我们都知道在计算机内部数据的存储和运算都采用二进制,是因为计算机是由很多晶体管组成的,而晶体管只有2种状态,恰好可以用二进制的0和1表示,并且采用二进制可以使得计算机内部的运算规则简单,稳定性高。在计算机中存在实数和整数,而整数又分为无符号整数和有符号整数,无符号的整数表示很简单,直接采用其二进制形式表示即可,而对于有符号数的表示却成了问题,如何表示正负?如何去处理正负号?下面来具体说下其中的原...
阅读全文
1.I/O函数
(1)scanf函数:
int scanf(const char *format…..);
从标准输入流stdin中按格式format将数据写到参数表中;若操作成功,返回写到参数表中的参数个数,否则返回EOF;
注意以下几点:
①scanf函数没有精度控制
如出现:
scanf(“%6.2f”,&a);
是绝对错误的。
②在以%c格式输入字符数据时,所有输入的均为有效字符
如:
scanf(“%c%c%c”,&a,&b,&c);
输入...
阅读全文
大家都知道指针是C语言中的精粹,学好了指针基本就等于学号了C语言,它能直接对物理地址进行访问,具有双重功能,是嵌入式设计中必不可少的一门语言。C语言功能强大的主要原因就是具有指针结构。指针是一种特殊的数据类型,直接指向目标的存储地址,实现直接访问对象存储空间的功能。
下面谈谈几个指针中常见的问题:
1.声明指针和取指针变量所指向内存空间的数据时所用到的 * 符号的意义;
如:
int a;
...
阅读全文
在谈述函数调用和返回值问题之前,先来看看C++中内存分配的问题。
C++编译器将计算机内存分为代码区和数据区,很显然,代码区就是存放程序代码,而数据区则是存放程序编译和执行过程出现的变量和常量。数据区又分为静态数据区、动态数据区,动态数据区包括堆区和栈区。
以下是各个区的作用:
(1)代码区:存放程序代码;
(2)数据区。
a.静态数据区: 在编译器进行编译的时候就为该变量分配的内存,存放在...
阅读全文
任何数据在内存中都是以二进制的形式存储的,例如一个short型数据1156,其二进制表示形式为00000100 10000100。则在Intel CPU架构的系统中,存放方式为 10000100(低地址单元) 00000100(高地址单元),因为Intel CPU的架构是小端模式。但是对于浮点数在内存是如何存储的?目前所有的C/C++编译器都是采用IEEE所制定的标准浮点格式,即二进制科学表示法。
在二进制科学表示法中,S=M*2^N 主要由三部分构成:符号位+阶码(N)+...
阅读全文