2009-07-24 16 views
119

मैं क्षेत्रीय ऑनलाइन न्यायाधीश (एसपीओजे) से The Next Palindrome समस्या का प्रयास कर रहा हूं जहां मुझे दस लाख अंकों के पूर्णांक के लिए पैलिंड्रोम खोजने की आवश्यकता है। मैंने स्ट्रिंग्स को उलटाने के लिए जावा के कार्यों का उपयोग करने के बारे में सोचा, लेकिन क्या वे स्ट्रिंग को लंबे समय तक रहने की अनुमति देंगे?जावा स्ट्रिंग के कितने अक्षर हैं?

+0

क्या आप कह रहे हैं कि आपको एक ऐसा फ़ंक्शन लिखना होगा जो पैलिंड्रोम उत्पन्न करता है, जिसका आकार उपयोगकर्ता निर्दिष्ट है और लंबाई में 1 मिलियन वर्ण तक हो सकता है? – Robert

+3

* समस्या * (एसपीओजे से) में 100 गीगाबाइट फ़ाइल हो सकती है, और आप इसे एक बार में एक स्ट्रिंग में लोड करना चाहते हैं? गंभीरता से ... कृपया एक स्कैनर का उपयोग करें! –

+0

[संभवतः जावा में स्ट्रिंग की अधिकतम लंबाई - कॉलिंग लम्बाई() विधि] (https://stackoverflow.com/questions/816142/strings- अधिकतम- लम्बाई-in-java-calling-length-method) – Bergi

उत्तर

175

आप लंबाई Integer.MAX_VALUE की एक स्ट्रिंग प्राप्त करने में सक्षम होना चाहिए (हमेशा 2147483647 (2 - 1) जावा विनिर्देश द्वारा, एक सरणी है, जो स्ट्रिंग वर्ग आंतरिक भंडारण के लिए उपयोग करता है की अधिकतम आकार) या आधा अपने अधिकतम ढेर आकार (चूंकि प्रत्येक वर्ण दो बाइट्स है), जो भी छोटा हो।

+31

... या आपका अधिकतम ढेर आकार 2 से विभाजित है ... चूंकि चरित्र 2 बाइट – ChssPly76

+2

@ ChssPly76 है: हाँ, यह सही है। मैंने अपना जवाब संपादित किया, धन्यवाद। –

+2

मैं अधिकतम ढेर आकार कैसे प्राप्त करूं? साथ ही, मुझे नहीं पता कि मेरी समस्या का परीक्षण करने के लिए न्यायाधीश किस जावा वर्चुअल मशीन का उपयोग कर रहा है वह JVM आश्रित के spec का Integer.MAX_VALUE हिस्सा है? – andandandand

16

मेरा मानना ​​है कि वे 2^31-1 वर्ण तक हो सकते हैं, क्योंकि वे एक आंतरिक सरणी द्वारा आयोजित होते हैं, और सरणी को जावा में पूर्णांक द्वारा अनुक्रमित किया जाता है।

+0

आंतरिक कार्यान्वयन का संभावित डुप्लिकेट अप्रासंगिक है - उदाहरण के लिए, वर्ण डेटा को लंबे समय तक संग्रहीत नहीं किया जा सकता है, इसका कोई कारण नहीं है। समस्या यह है कि इंटरफ़ेस लंबाई के लिए इंक का उपयोग करता है। 'getBytes' और इसी तरह की समस्याएं हो सकती हैं यदि आप बहुत बड़ी स्ट्रिंग के लिए प्रयास करते हैं। –

+0

यह सच है - मैं उस तथ्य को लागू कर रहा था। मेरी गलती। – aperkins

3

Integer.MAX_VALUE स्ट्रिंग की अधिकतम आकार है + अपनी स्मृति आकार की निर्भर करता है लेकिन क्षेत्र के ऑनलाइन न्यायाधीश पर समस्या आप उन कार्यों का उपयोग करने की जरूरत नहीं है

5

आप उपयोग कर String के बजाय BigDecimal अपने संख्या धारण करने के लिए माना जाता है ?

+1

यह इस बात पर निर्भर करता है कि एप्लिकेशन संख्याओं के साथ क्या करने जा रहा है। यदि यह केवल पैंडिंड्रोम ढूंढने, दशमलव (दशमलव) अंकों की गणना करने जैसी पाठ्यपुस्तक करने जा रहा है, तो एक स्ट्रिंग बेहतर है। यदि यह अंकगणित करने जा रहा है, तो बिगडिसीमल (या बिगइंटर) बेहतर है। –

+0

समस्या यह है कि "प्रत्येक के लिए, छोटे से छोटे पैंडिंड्रो को के से बड़ा उत्पादन करें।" (जहां के नंबर दिया गया है)। के के मुकाबले पहले पालिंड्रोम को आउटपुट करने के लिए यह बहुत आसान होगा। आपको अंक से एक बड़ा खोजने के लिए अंकगणित की आवश्यकता होती है। उदाहरण: 99 99 99 99 99 99 से बड़ा अगला पालिंड्रोम, या 12 9 22 से बड़ा अगला पालिंड्रोम खोजें। –

0

ढेर भाग खराब हो जाता है, मेरे दोस्त। यूटीएफ -16 को 16 बिट्स तक सीमित होने की गारंटी नहीं है और 32

+1

जावा के 'char' प्रकार को छोड़कर) 16 बिट्स बिल्कुल, इसलिए बिट्स यूटीएफ -16 उपयोगों की संख्या वास्तव में कोई फर्क नहीं पड़ता ... – awksp

-3

का विस्तार कर सकते हैं यदि आप Google के ऐप इंजन का उपयोग करते हैं, com.google.appengine.api.datastore.Text मदद कर सकता है। यह एक स्ट्रिंग को 1 मेगाबाइट तक स्टोर करने की अनुमति देता है।

+9

स्ट्रिंग पहले से ही 2 जीबी तक स्टोर कर सकती है, इसलिए एक कक्षा जो 1 एमबी तक स्टोर कर सकती है, यहां मदद नहीं कर रही है। –

+1

यदि आप किसी वेबपृष्ठ के लिंक को शामिल करते हैं तो यह उपयोगी होगा, और इसे आगे के विवरण में विस्तारित किया गया है, और जावा 9 में आपके उत्तर –

10

जबकि आप सिद्धांत Integer.MAX_VALUE वर्णों में कर सकते हैं, JVM उस सरणी के आकार में सीमित है जिसका उपयोग कर सकते हैं।

public static void main(String... args) { 
    for (int i = 0; i < 4; i++) { 
     int len = Integer.MAX_VALUE - i; 
     try { 
      char[] ch = new char[len]; 
      System.out.println("len: " + len + " OK"); 
     } catch (Error e) { 
      System.out.println("len: " + len + " " + e); 
     } 
    } 
} 
ओरेकल जावा 8 अद्यतन पर

92 प्रिंट

len: 2147483647 java.lang.OutOfMemoryError: Requested array size exceeds VM limit 
len: 2147483646 java.lang.OutOfMemoryError: Requested array size exceeds VM limit 
len: 2147483645 OK 
len: 2147483644 OK 

नोट: जावा 9 में, तार का उपयोग करेगा बाइट [] जो मतलब है कि बहु-बाइट वर्ण एक से अधिक बाइट का उपयोग करें और कम हो जाएगा अधिकतम आगे यदि आपके पास सभी चार बाइट कोड-पॉइंट्स हैं उदा। इमोजिस, आपको केवल 500 मिलियन वर्ण

+1

[कॉम्पैक्ट स्ट्रिंग्स] (http://openjdk.java.net/jeps/254) पर विस्तारित किया गया है या तो लैटिन -1 या यूटीएफ -16 एन्कोडिंग। कोई चर लंबाई लंबाई एन्कोडिंग, यानी, कोई तीन बाइट वर्ण नहीं है। – apangin

+0

@apangin "यह यूटीएफ -8 जैसे वैकल्पिक एन्कोडिंग का उपयोग करने का लक्ष्य नहीं है" सुधार के लिए धन्यवाद। –

1

जावा 9 स्ट्रिंग.वल्यू स्टोर करने के लिए बाइट [] का उपयोग करेगा, ताकि आप जावा 9 में केवल 1 जीबी स्ट्रिंग प्राप्त कर सकें। दूसरी ओर जावा 8 में 2 जीबी स्ट्रिंग हो सकती है।

चरित्र से मेरा मतलब है "char", कुछ चरित्र बीएमपी (कुछ इमोजीज़ की तरह) में प्रतिनिधित्व योग्य नहीं है, इसलिए इसमें अधिक (वर्तमान में 2) वर्ण होंगे।

संबंधित मुद्दे