查找序列里最长的近似等差数列,可控制公差的精度
def find_longest2(array,precision):
array.sort()
print(array)
i = 0
arr_length = len(array)
total_arr = []
while i < arr_length-1:
j = i+1
candidate_arr = []
candidate_arr.append(array[i])
candidate_arr.append(array[j])
count = 2
diff = array[j]-array[i]
print(str(diff),' ',str(array[i]),' ',str(array[j]))
while j < arr_length:
k = j + 1
while k < arr_length:
if abs(array[k]-count*diff-array[i]) < precision:
print(str(diff),' ',str(array[i]+count*diff),' ',str(array[k]))
count = count+1
candidate_arr.append(array[k])
k = k + 1
#print(count)
j = j +1
i = i + 1
print(candidate_arr)
total_arr.append(candidate_arr)
return total_arr
private List<FreqencyInfo> SearchFundamentalFrequency(double[] frequencies, double precision)
{
double frequency = 0;
int array_length = 0;
int length = frequencies.Length;
List<FreqencyInfo> finfo = new List<FreqencyInfo>();
for(int i = 0; i < length - 1; i++)
{
List<double> candidate_arr = new List<double>();
candidate_arr.Add(frequencies[i]);
candidate_arr.Add(frequencies[i+1]);
int count = 2;
double diff = frequencies[i+1] - frequencies[i];
for (int j = i+1; j < length; j++)
{
for(int k = j+1; k < length; k++)
{
if (Math.Abs(frequencies[k] - count * diff - frequencies[i])<precision) {
count++;
candidate_arr.Add(frequencies[k]);
}
}
}
FreqencyInfo fi = new FreqencyInfo();
fi.frequencies = candidate_arr.ToArray();
fi.length = candidate_arr.Count;
fi.fundamentalFrequency = diff;
finfo.Add(fi);
if (candidate_arr.Count > array_length)
{
array_length = candidate_arr.Count;
frequency = diff;
}
}
return finfo;
}