数据结构
-
概念:
- 数据之间的关系,提供程序效率
- 逻辑关系:人为的认为的关系。
- 集合: 在一个范围内有多个数据, 数据之间没有关系
- 线性: 数据之间一对一的关系
- 树型:数据之间一对多的关系, 如:win 文件夹....
- 图: 多对多, 如地图之间城市之间交通关系.
- 物理关系:内存存储
- 顺序存储 : 在内存中存储数据为连续的空间(数组)。
- 链式存储 : 链表:
- 逻辑关系:人为的认为的关系。
- 数据之间的关系,提供程序效率
n!:阶乘是从1*2*3*...n
代码如下:
@Test
public void test01(){
//求5的阶乘 为 120 , 那么50的阶乘就不行了, 应该超出了int的范围
int n = 5;
int temp1 = 1;
for (int i = 1;i<=n;i++){
temp1 = i * temp1;
}
System.out.println(temp1);
}
-
如何解决上述问题, 即 大数字运算。
-
使用数组实现
-
例如实现 327 * 18 分为以下步骤:
- 创建一个数组依次存放327的每一位到数组中,没一位分别于18 想乘 结果存放到一个新数组中
- 代码实现如下:
@Test
public void test01(){
int[] ints = new int[6];
ints[ints.length-1] = 2; //个
ints[ints.length-2] = 7; //十
ints[ints.length-3] = 3; //百
int num = 18;
//计算每一位
for (int i = 0; i<ints.length; i++){
ints[i] *= num;
}
//进位和留位 , 需要重后前算
for (int i= ints.length-1;i>0;i--){
ints[i-1] += ints[i]/10;
ints[i] = ints[i] % 10;
}
for (int i:ints){
System.out.println(i);
}
}
50的阶乘如何实现:
private int[] demo(int[] ints, int num){
//计算每一位
for (int i = 0; i<ints.length; i++){
ints[i] *= num;
}
//进位和留位 , 需要重后前算
for (int i= ints.length-1;i>0;i--){
ints[i-1] += ints[i]/10;
ints[i] = ints[i] % 10;
}
return ints;
}
@Test
public void test01(){
int n = 100;
//计算50的阶乘
int[] ints = new int[1000];
ints[ints.length-1] = 1; //个
//计算每一位
for (int i = 1; i<n; i++){
ints = demo(ints,i);
}
for (int i : ints){
System.out.print(i);
}
}
-
俩个大数字运算如何实现......
排序
-
插入排序
插入排序 像 斗地主摸牌一样, 摸一张牌将它插入到合适的位置..
public static void sort(int[] numbers){
for (int i = 1; i < numbers.length; i++) {
int currentNumber = numbers[i];
int j = i - 1;
while (j >= 0 && numbers[j] > currentNumber) {
numbers[j + 1] = numbers[j];
j--;
}
numbers[j + 1] = currentNumber;
}
}
查找
-
二分查找法
前提: 有序
/**
* 不使用递归的二分查找
*title:commonBinarySearch
*@param arr
*@param key
*@return 关键字位置
*/
public static int commonBinarySearch(int[] arr,int key){
int low = 0;
int high = arr.length - 1;
int middle = 0; //定义middle
if(key < arr[low] || key > arr[high] || low > high){
return -1;
}
while(low <= high){
middle = (low + high) / 2;
if(arr[middle] > key){
//比关键字大则关键字在左区域
high = middle - 1;
}else if(arr[middle] < key){
//比关键字小则关键字在右区域
low = middle + 1;
}else{
return middle;
}
}
return -1; //最后仍然没有找到,则返回-1
}