[동적 기획] m개의 정수를 포함하는 수조를 n개의 수조로 나누고 각 수조의 합은 가능한 한 가깝다
5996 단어 추천 시스템
ClickHouse 클러스터 용량 축소는 데이터가 손실되지 않도록 용량이 필요한 노드의 데이터를 다른 노드로 마이그레이션하여 각 기계로 마이그레이션되는 데이터의 양을 최대한 균형 있게 할 계획입니다.데이터의 이동은partition 단위로 모든 partition의 데이터 양을 알고 있습니다.
추상
m개의 정수를 포함하는 수조를 n개의 수조로 나누어 각각 수조와 최대한 가깝게 하다
3 사고방식
이 문제는 전형적인 동적 기획의 문제로 이론적으로 가장 좋은 문제를 찾을 수 없지만 이번에는 실제 생산에서의 문제를 해결하기 위한 것이지 AC를 원하지 않는다. 그래서 우리는 상대적으로 합리적인 알고리즘을 찾아서 파티션의 분배가 상대적으로 균형이 잡히면 된다.
입력:int 배열, 그룹 수 divisionNum
우리는 밤을 하나 들었다.
수조는 500,18,28,2,27,35,22,10,6,5,3,2,1이다.4조로 나누다
순서: 500, 35, 28, 27, 22, 18, 10, 6, 5, 3, 2, 2, 1
평균 avg = 164.75 계산
배열 반복:
arr 0 is : 500, sum = 500
arr 1 is : 35 18, sum = 53
arr 2 is : 28 22 3, sum = 53
arr 3 is : 27 10 6 5 2 2 1, sum = 53
실현
import math
# n ,
def GetAvgArr(number_list, arr_num):
avg_arrays = []
if len(number_list) == 0 or len(number_list) < arr_num:
return avg_arrays
# 1.
sum_value = 0
mean_value = 0
number_list_float = []
for num in number_list:
number_list_float.append(float(num))
sum_value += float(num)
mean_value = sum_value / float(arr_num)
# 2.
number_list_float.sort(reverse=True)
for cnt in range(0, arr_num):
# print("mean = ", mean_value)
arr = []
if cnt == arr_num-1:
# ,
avg_arrays.append(transFloatToIntList(number_list_float))
break
# max >= mean,
if len(number_list_float) > 0 and number_list_float[0] >= mean_value:
arr = [number_list_float[0]]
avg_arrays.append(transFloatToIntList(arr))
sum_value = sum_value - number_list_float[0]
# partition
mean_value = sum_value / float(arr_num-len(avg_arrays))
else:
#
arr, _ = getList(number_list_float, mean_value, math.pow(mean_value, 2))
avg_arrays.append(transFloatToIntList(arr))
# ,
number_list_float = removeFromFloatList(number_list_float, arr)
return avg_arrays
# []float []int
def transFloatToIntList(float_list):
res = []
for item in float_list:
res.append(int(item))
return res
# remove_nums originalList
def removeFromFloatList(original_list, remove_nums):
res = []
start = 0
for remove in remove_nums:
for i in range(start, len(original_list)):
if original_list[i] == remove:
res.extend(original_list[start:i])
start = i + 1
break
res.extend(original_list[start:])
return res
def getList(arr, delta, distance):
res = []
if len(arr) == 0:
return res, -1
for i in range(0, len(arr)-1):
if delta == arr[i]:
res.append(arr[i])
return res, 0
elif delta < arr[i]:
continue
elif delta > arr[i]:
if i == 0:
res.append(arr[i])
delta = delta - arr[i]
distance = math.pow(delta, 2)
tmp, d = getList(arr[i+1:], delta, distance)
res.extend(tmp)
return res, d
else:
dis1 = math.pow(arr[i-1]-delta, 2)
dis2 = math.pow(delta-arr[i], 2)
if dis1 > dis2:
res.append(arr[i])
delta = delta - arr[i]
tmp, d = getList(arr[i+1:], delta, dis2)
res.extend(tmp)
return res, d
else:
tmp, d = getList(arr[i:], delta, dis2)
if dis1 > d:
res.extend(tmp)
return res, d
res.append(arr[i-1])
return res, dis1
dis = math.pow(delta-arr[len(arr)-1], 2)
if dis < distance:
return arr[len(arr)-1:], dis
return [], -1
테스트
def main():
partition_list = [500, 18, 28, 2, 27, 35, 22, 10, 6, 5, 3, 2, 1]
print("test partitionList is : {}".format(partition_list))
print("result is :")
arrays = GetAvgArr(partition_list, 4)
for i, arr in enumerate(arrays):
print("arr {} is : {}, ".format(i, arr))
sum_value = 0
for value in arr:
sum_value += value
print("sum = {}".format(sum_value))
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[프로그래머스 과제관] 채용 공고 추천 - EDA 및 전처리Programmers 채용 공고 페이지를 방문한 개발자들의 방문/지원 기록을 바탕으로 추천 모델을 만들어야 합니다. 전체 학습 데이터 중 applied = 1인 데이터와 applied = 0인 데이터의 수를 살펴보았...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.