linux 数组问题求解
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux 数组问题求解相关的知识,希望对你有一定的参考价值。
1、声明是报错,写成declare -afFirtx ass_array ?
2、为什么打印出的结果会是apple is orange呢?
为啥列出数组索引出来空?啥都没有呢
比较正确的数组索引用法如下:
#!/bin/bash
declare ass_array
index1=0
index2=1
ass_array=([index1]=apple [index2]=orange)
echo "apple is $ass_array[index1]"
echo $ass_array[*]
echo $ass_array[@]
echo $#ass_array[@]
echo index0 is
echo $ass_array[0]
echo index1 is
echo $ass_array[1]
输出结果如下
################################################################
你错的原因如下:
1.不太清楚如何使用索引给数组元素赋值。
2.没有给index1,index2赋值,导致它们为空,它们在被当做数字使用时,值为0
ass_array=([index1=apple] [index2]=orange)
等效于
ass_array=([0]=[index1=apple] [0]=orange)
即,
第一个元素ass_array[0] 内容首先被赋值为字符串:[index1=apple]
马上,ass_array[0]的值又被赋值为字符串:orange
所以,
echo "apple is $ass_array[index1]"
等效于
echo "apple is $ass_array[0]"
你得到结果:
apple is orange
###### 你的第二次尝试 ##############
由于没有给index1,index2赋值,导致它们为空,它们在被当做数字使用时,值为0
ass_array=([index1]=apple [index2]=orange)
等效于:
ass_array=([0]=apple [0]=orange)
即
ass_array[0]的值,先被赋值为 apple,又紧接着被赋值为 orange
所以
echo "apple is $ass_array[index1]"
等效于
echo "apple is $ass_array[0]"
你得到结果:
apple is orange
那怎么赋值
动态规划求解最长递增子序列的长度
一,问题描述
给定一个序列,求解它的最长 递增 子序列 的长度。比如: arr[] = {3,1,4,1,5,9,2,6,5} 的最长递增子序列长度为4。即为:1,4,5,9
二,算法分析
有两种方式来求解,一种是转化为LCS问题。即,首先对数组排序,将排序后的结果存储在辅助数组中。排序时间复杂度O(NlogN),排序后的数组与原数组组成了LCS(N,N)问题。解决LCS问题的时间复杂度为O(N^2),故整个算法的时间复杂度为O(N^2),空间复杂度为O(N)
另一种方式是直接用DP求解,算法如下:时间复杂度为O(N^2)
①最优子问题
设lis[i] 表示索引为 [0...i] 上的数组上的 最长递增子序列。初始时,lis[i]=1,注意,在DP中,初始值是很重要的,它是整个算法运行正确的关键。而初始值 则可以 通过 画一个小的示例来 确定。
当 arr[i] > arr[j],lis[i] = max{lis[j]}+1 ;其中,j 的取值范围为:0,1...i-1
当 arr[i] < arr[j],lis[i] = max{lis[j]} ;其中,j 的取值范围为:0,1...i-1
②重叠子结构
从上面可以看出,计算 lis[i]时,需要计算 lis[j],其中 j < i,这说明有重叠子问题。借用网路中一张图如下:
lis(4) / | \\ lis(3) lis(2) lis(1) / \\ / lis(2) lis(1) lis(1) / lis(1)
而初始值 则可以 通过 画一个小的示例来 确定。
参考资料:
三,代码实现
错误版本1:
1 private static int lis(int[] arr, int length){ 2 int lis[] = new int[length]; 3 4 //init 5 for(int i = 0; i < length; i++) 6 lis[i] = 1; 7 8 for(int i = 1; i < length; i++) 9 { 10 for(int j = 0; j < i; j++) 11 { 12 13 if(arr[i] > arr[j]) 14 { 15 if(lis[j] + 1 > lis[i]) 16 lis[i] = lis[j] + 1; 17 } 18 else{ 19 if(lis[j] > lis[i]) 20 lis[i] = lis[j]; 21 } 22 } 23 } 24 return lis[length - 1]; 25 }
第13行if语句会导致bug,arr[i]要大于 j belongs to 0,1,...i-1 中所有的 arr[j]中的最大值,并且 lis[i] 是该最大值 arr[j] 所对应的 lis[j] +1,而不是某个其他的arr[j] 对应的 lis[j]+1
正确完整版本:
public class LIS { public static int lis(int[] arr){ if(arr == null || arr.length == 0) return 0; return lis(arr, arr.length); } private static int lis(int[] arr, int length){ int lis[] = new int[length]; //init for(int i = 0; i < length; i++) lis[i] = 1; for(int i = 1; i < length; i++) { for(int j = 0; j < i; j++) { // lis[i]=max{lis[i-1], lis[i-1]+1} if(arr[i] > arr[j] && lis[j] + 1 > lis[i]) lis[i] = lis[j] + 1; } } int max = lis[0]; for(int i = 1; i < length; i++) if(max < lis[i]) max = lis[i]; return max; } public static void main(String[] args) { int[] arr = {3,1,4,1,5,9,2,6,5}; int result = lis(arr); System.out.println(result); } }
以上是关于linux 数组问题求解的主要内容,如果未能解决你的问题,请参考以下文章