「这是我参与2022首次更文挑战的第9天,活动详情查看:2022首次更文挑战」
一、为什么要学习数据结构和算法
其实,以前我们都会说,学习数据结构有多么多么的重要,长篇大论。这次,我们java程序员来看看数据结构和算法重要性。
例题:判断一个数是否是2的n次方。比如:2,4,8,16是2的n次方;6,10不是。
拿到这道题,用java的思路分析:
2:2
4:2*2
8:2 * 2 * 2
16:2 * 2 * 2 * 2
如果一个数除以2,最后余数是0,那么这个数就是2的n次方;如果余数是1,那么就不是。代码实现如下:
public static void main(String[] args) {
// 随意给一个数,判断这个数是不是2的n次方
int n = 16;
int yuShu = n%2;
int chuShu = n/2;
while (chuShu > 1) {
yuShu = chuShu % 2;
chuShu = chuShu / 2;
}
System.out.println( n + " 这个数" + (yuShu == 0?"是":"不是")+"2的n次方");
}
但是,如果使用数据结构呢?下面来分析一下:将所有的十进制数字都转成2进制
2:10
4:100
8:1000
16:10000
他们的特点是什么呢?第一个数字是1,其余的都是0
而这几个数字之前的一个数字是什么呢?
1:01
3:011
7:0111
15:01111
他们的特点是什么呢?第一个是0,其余的都是1.
利用这两组数字,我们找规律,如果i和i-1按位&与的结果是0,就说明这个i是2的n次方;否则就不是
2 & 1 = 0
4 & 3 = 0
8 & 7 = 0
16 & 15 = 0
但是15 & 14呢,14的二进制数是01110,01111 & 01110 = 00001
所以,通过对数据的分析,我们可以用一句代码判断
if(n & (n=1) == 0) {
// 这个数就是2的n次方
} else {
// 否则不是
}
二、数据结构概述
数据结构包括:线性结构和非线性结构
1、线性结构
1)线性结构是最常用的数据结构,其特点是数据元素之间存在一对一的线性关系。
2)线性结构有两种不同的存储结构,即顺序存储结构和链式存储结构。顺序存储的线性表成为顺序表,顺序表中的存储元素是连续的
3)链式存储的线性表成为链表,链表中的存储元素不一定是连续的,元素节点中存放数据元素以及相邻元素的地址信息。
4)线性结构常见的有:数组、队列、链表和栈,后面我们会详细讲解
2、非线性结构
非线性结构包括:二维数组、多维数组、广义表、树结构、图结构